我希望使用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']
答案 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']