繁体   English   中英

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

[英]Python: Unexpected regex behaviour for {n} match

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

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

例如,匹配4个数字,然后匹配三个重复的空格集,后跟四个数字。 在正则表达式上,这正确匹配:

test1234消息1234 5678 1234 5678

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

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

我不明白为什么它与“ 5678”的第二个实例匹配,以及为什么它与我期望的不匹配。

推荐使用原始字符串来定义正则表达式,但是这里的问题主要是由于findall方法的实现。 您需要打开记录出现在论坛中的正则表达式的非捕获组 因为re.findall函数首先赋予了捕获优先权,然后re.findall匹配项。 您的正则表达式\\d{4}(\\s\\d{4}){3}与16位数字匹配,但仅捕获最后四个加上前面的空格。

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']

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

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

要么

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM