regex Pythonre.search

zqdjd7g9  于 2023-03-31  发布在  Python
关注(0)|答案(2)|浏览(87)

我有一个字符串变量包含

string = "123hello456world789"

字符串不包含空格。我想写一个正则表达式,只打印包含(a-z)的单词。我试了一个简单的正则表达式

pat = "([a-z]+){1,}"
match = re.search(pat, word, re.DEBUG)

match对象只包含单词Hello,单词World不匹配。
当使用re.findall()时,我可以得到HelloWorld
我的问题是为什么我们不能用re.search()来做这件事?
如何使用re.search()

ccgok5k5

ccgok5k51#

re.search()在字符串documenation中找到模式once
扫描字符串,查找正则表达式模式产生匹配的位置,并返回相应的MatchObject示例。如果字符串中没有位置与模式匹配,则返回None;注意,这不同于在字符串中的某个点处找到零长度匹配。
为了匹配每个出现,您需要re.findall(),文档:
以字符串列表的形式返回字符串中模式的所有非重叠匹配项。字符串从左到右扫描,匹配项按找到的顺序返回。如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组的列表。2空匹配包含在结果中,除非它们触及另一个匹配的开始。

示例:

>>> import re
>>> regex = re.compile(r'([a-z]+)', re.I)
>>> # using search we only get the first item.
>>> regex.search("123hello456world789").groups()
('hello',)
>>> # using findall we get every item.
>>> regex.findall("123hello456world789")
['hello', 'world']

更新日期:

由于your duplicate questionas discussed at this link),我在这里添加了我的另一个答案:

>>> import re
>>> regex = re.compile(r'([a-z][a-z-\']+[a-z])')
>>> regex.findall("HELLO W-O-R-L-D") # this has uppercase
[]  # there are no results here, because the string is uppercase
>>> regex.findall("HELLO W-O-R-L-D".lower()) # lets lowercase
['hello', 'w-o-r-l-d'] # now we have results
>>> regex.findall("123hello456world789")
['hello', 'world']

正如您所看到的,您提供的第一个示例失败的原因是因为大写,您可以简单地添加re.IGNORECASE标志,尽管您提到匹配应该只使用小写。

hjzp0vay

hjzp0vay2#

@InbarRose的回答说明了为什么re.search是这样工作的,但是如果你想要match对象,而不仅仅是re.findall的字符串输出,请使用re.finditer

>>> for match in re.finditer(pat, string):
...     print match.groups()
...
('hello',)
('world',)
>>>

或者,如果您需要list

>>> list(re.finditer(pat, string))
[<_sre.SRE_Match object at 0x022DB320>, <_sre.SRE_Match object at 0x022DB660>]

使用string作为变量名通常也是一个坏主意,因为它是一个公共模块。

相关问题