我正在寻找一种方法来检测在字符串中出现两次的任何全大写单词(或其部分)的位置。 示例 - 以粗体显示我想要检测的位置:
- 00004 ADC 一些随机单词ADC任何其他不相关的字符
- 02 一些 CANIT CAN 任何其他不相关的 200
- 399 ADC0 FLAG ADC0 还有一些单词 adc
我所拥有的(并且似乎在在线正则表达式解析器中工作)是这个
p = re.compile('( [A-Z]{2,}[A-Z0-9]*).*(\1)')
match = p.search('0x0000 ADC asdf ADC')
print(match)
我尝试了空白等的不同变体,但这会产生 Nonetype 匹配。有什么提示这个正则表达式有什么问题吗?
最佳答案
定义正则表达式模式时使用原始字符串。 (请参阅第二段和第三段中的 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)]
关于python - 正则表达式单词在字符串中出现两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22645927/