我正在寻找一种方法来检测字符串中出现两次的所有大写单词(或部分单词)的位置。 示例 - 粗体显示我想要检测的位置:
我有(并且似乎在在线正则表达式解析器中工作)是这个
p = re.compile('( [A-Z]{2,}[A-Z0-9]*).*(\1)')
match = p.search('0x0000 ADC asdf ADC')
print(match)
我尝试了不同的空白等变体,但这会产生Nonetype以进行匹配。任何暗示这个正则表达式有什么问题?
答案 0 :(得分:2)
定义正则表达式模式时使用原始字符串。 (请参阅第二和第三段中的discussion of this issue以及raw string notation的说明)在您的情况下,'\1'
被解释为单个字符chr(1)
:
In [173]: '\1'
Out[173]: '\x01'
In [181]: list('\1')
Out[181]: ['\x01']
然而,你想要两个字符,一个反斜杠后跟一个1:
In [180]: list(r'\1')
Out[180]: ['\\', '1']
In [176]: p = re.compile(r'( [A-Z]{2,}[A-Z0-9]*).*(\1)')
In [177]: p.search('0x0000 ADC asdf ADC')
Out[177]: <_sre.SRE_Match at 0xb439770>
请注意,如果您希望找到尽可能多的此类模式,请使用非贪婪的.*?
代替.*
:
In [195]: [(match.start(), match.end()) for match in re.finditer(r'\b([A-Z]{2,}[A-Z0-9]*).*?(\1)', '0x0000 ADC asdf ADC0 ADC ADC0')]
Out[195]: [(7, 19), (21, 28)]
答案 1 :(得分:1)
其\\1
而非\1
p = re.compile('( [A-Z]{2,}[A-Z0-9]*).*(\\1)')