Python:{n}匹配的意外正则表达式行为

2024-09-25 06:32:25 发布

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

我已经在http://regexpal.com/上测试了以下代码,它正确地匹配了我想要的字符串。我想找出16位数字,这些数字以4块为单位,中间有一个空格,因此我编写了以下正则表达式:

\d{4}(\s\d{4}){3}

例如,匹配4个数字,然后匹配一个空格的三个重复集,后跟四个数字。在regexpal上,它正确匹配:

test1234 message1234 5678 1234 5678

但是,在Python中,我运行以下代码:

>>> import re
>>> p = re.compile('\d{4}(\s\d{4}){3}')
>>> p.findall('test1234 message1234 5678 1234 5678')
[' 5678']
>>>

我不明白为什么它匹配的是第二个实例的'5678',为什么它不匹配的数字块,因为我预计。你知道吗


Tags: 实例字符串代码importrecomhttp单位
2条回答

您需要在字符串前面加上r或转义反斜杠:

p = re.compile(r'\d{4}(\s\d{4}){3}')

或者

p = re.compile('\\d{4}(\\s\\d{4}){3}')

raw string是定义regex的推荐方法,但是这里的问题主要是因为findall方法的实现。您需要将正则表达式中的捕获组转换为非捕获组。因为re.findall函数首先优先选择捕获,然后是匹配。正则表达式\d{4}(\s\d{4}){3}与16位数字匹配,但只捕获最后4位加上前面的空格。你知道吗

p = re.compile(r'\d{4}(?:\s\d{4}){3}')

示例:

>>> import re
>>> p = re.compile(r'\d{4}(\s\d{4}){3}')
>>> p.findall('test1234 message1234 5678 1234 5678')
[' 5678']
>>> p = re.compile(r'\d{4}(?:\s\d{4}){3}')
>>> p.findall('test1234 message1234 5678 1234 5678')
['1234 5678 1234 5678']

相关问题 更多 >