【发布时间】:2012-01-06 03:03:25
【问题描述】:
使用 Python 和正则表达式,我试图在一段文本中查找以大写字母开头但不在句子开头的单词。
我能想到的最好方法是检查单词前面是否没有句号,然后是空格。我很确定我需要使用负面的lookbehind。这是我到目前为止所拥有的,它会运行但总是什么都不返回:
(?<!\.\s)\b[A-Z][a-z]*\b
我认为问题可能在于在单词边界 \b 内使用 [A-Z][a-z]* 但我真的不确定。
感谢您的帮助。
【问题讨论】:
使用 Python 和正则表达式,我试图在一段文本中查找以大写字母开头但不在句子开头的单词。
我能想到的最好方法是检查单词前面是否没有句号,然后是空格。我很确定我需要使用负面的lookbehind。这是我到目前为止所拥有的,它会运行但总是什么都不返回:
(?<!\.\s)\b[A-Z][a-z]*\b
我认为问题可能在于在单词边界 \b 内使用 [A-Z][a-z]* 但我真的不确定。
感谢您的帮助。
【问题讨论】:
您的正则表达式似乎有效:
In [6]: import re
In [7]: re.findall(r'(?<!\.\s)\b[A-Z][a-z]*\b', 'lookbehind. This is what I have')
Out[7]: ['I']
确保在指定正则表达式时使用的是原始字符串 (r'...')。
如果您有一些正则表达式不起作用的特定输入,请将它们添加到您的问题中。
【讨论】:
尽管您专门要求使用正则表达式,但考虑列表推导式可能会很有趣。它们有时更具可读性(尽管在这种情况下,可能以效率为代价)。这是实现此目的的一种方法:
import string
S = "T'was brillig, and the slithy Toves were gyring and gimbling in the " + \
"Wabe. All mimsy were the Borogoves, and the Mome Raths outgrabe."
LS = S.split(' ')
words = [x for (pre,x) in zip(['.']+LS, LS+[' '])
if (x[0] in string.uppercase) and (pre[-1] != '.')]
【讨论】:
尝试循环输入:
(?!^)\b([A-Z]\w+)
并捕获第一组。如您所见,也可以使用负前瞻,因为您要匹配的位置是除行首之外的所有位置。消极的回顾会产生同样的效果。
【讨论】: