Python正则表达式,以避免匹配单词后跟多个条件

时间:2015-10-05 14:07:32

标签: python regex

我希望使用Python 3匹配句子中间的大写字符单词。这是我目前的正则表达式:

.+?\b([A-Z]+)\b(?=[^.!?][^ ])

所以我想避免匹配这组字符[^.!?] 后面的单词。但是这个表达式还匹配一个单词后跟一个句点和 no 空格。我的错是什么?

即目前,我使用re.findall() 在搜索字符串末尾没有的空格时得到相同的结果:

>>> re.findall(r'.+?\b([A-Z]+)\b(?=[^.!?][^ ])','NO YES YES YES YES NO. ')
['YES', 'YES', 'YES', 'YES']
>>> re.findall(r'.+?\b([A-Z]+)\b(?=[^.!?][^ ])','NO YES YES YES YES NO.')
['YES', 'YES', 'YES', 'YES']

2 个答案:

答案 0 :(得分:1)

使用否定前瞻

尝试此正则表达式
r'(?!^)\b([A-Z]+)\b(?![.!?] )'

(?!^)会在句子开头跳过这个词。

(?![.!?] )将失败,当单词后跟其中一个字符后跟一个空格。

<强>示例:

>>> re.findall(r'(?!^)\b([A-Z]+)\b(?![.!?] )','NO YES YES YES YES NO.')
['YES', 'YES', 'YES', 'YES', 'NO']

>>> re.findall(r'(?!^)\b([A-Z]+)\b(?![.!?] )','NO YES YES YES YES NO. ')
['YES', 'YES', 'YES', 'YES']

答案 1 :(得分:0)

print(re.findall(r'[^A-Z](.+)[^A-Z]\S+\s*$','NO YES YES YES YES NO. '))

['YES YES YES YES']

print(re.findall(r'[^A-Z](.+)[^A-Z]\S+\s*$','NO YES YES YES YES NO.'))

['YES YES YES YES']