使用?在正则表达式中的命名组中

2024-10-06 12:44:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用正则表达式搜索字符串中可能存在或不存在的部分。例如,“我2000年出生在荷兰”、“我2000年出生”或“我出生在荷兰”。问号的使用使我困惑。在本例中,我使用了两个命名组。我不明白为什么在两个指定的组中使用问号并不能给出我预期的结果。 两个命名组的问号都会导致

>>> line = 'I am born in 2000 in Holland'
>>> regex = re.search('[A-Za-z ]+(in (?P<year>\d\d\d\d))?\s?(in (?P<country>[A-z]+))?', line)
>>> regex.groupdict()
{'year': None, 'country': None}

我希望两个命名组都会给出该行的搜索内容。我不明白为什么正则表达式对两个命名组都没有结果

删除第一个命名组后或第二个命名组后的一个问号,即可得到预期结果

>>> line = 'I am born in 2000 in Holland'
>>> regex = re.search('[A-Za-z ]+(in (?P<year>\d\d\d\d))\s?(in (?P<country>[A-z]+))?', line)
>>> regex.groupdict()
{'year': '2000', 'country': 'Holland'}

>>> line = 'I am born in 2000 in Holland'
>>> regex = re.search('[A-Za-z ]+(in (?P<year>\d\d\d\d))?\s?(in (?P<country>[A-z]+))', line)
>>> regex.groupdict()
{'year': '2000', 'country': 'Holland'}

在只有一个字段的字符串中,使用带有两个问号的表达式,结果实际上与上面相同:

>>> line = 'I am born in 2000'
>>> regex = re.search('[A-Za-z ]+(in (?P<year>\d\d\d\d))?\s?(in (?P<country>[A-z]+))?', line)
>>> regex.groupdict()
{'year': None, 'country': None}

只有一个问号,结果与预期一致:

>>> regex = re.search('[A-Za-z ]+(in (?P<year>\d\d\d\d))?\s?(in (?P<country>[A-z]+))', line)
>>> regex.groupdict()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groupdict'

以及:

>>> line = 'I am born in 2000'
>>> regex = re.search('[A-Za-z ]+(in (?P<year>\d\d\d\d))\s?(in (?P<country>[A-z]+))?', line)
>>> regex.groupdict()
{'year': '2000', 'country': None}

请问谁能告诉我我对Python正则表达式的了解是不够的


Tags: inrenonesearchlineamyearcountry
2条回答

在第一个示例中,[A-Za-z ]+之后的所有内容都是可选的。评估者知道这一点,所以不麻烦。当它已匹配(或无法匹配)[A-Za-z ]+时停止。如果你想匹配这些组,你需要强迫它继续。一种方法是将$添加到正则表达式的末尾:

>>> regex = re.search('[A-Za-z ]+(in (?P<year>\d\d\d\d))?\s?(in (?P<country>[A-z]+))?$', line)
>>> regex.groupdict()
{'country': 'Holland', 'year': '2000'}

即使tho组是可选的,如果有,它仍将匹配。
但是in在到达之前就已经被消耗掉了,所以今年没有匹配

试试这个,在它到达in之前必须停止

r"(?:(?!in[ ]\d{4})[A-Za-z ])+(in[ ](?P<year>\d\d\d\d))?\s?(in[ ](?P<country>[A-z]+))?"

demodemo2

相关问题 更多 >