使用正则表达式查找不是在句子开头的大写字母

时间:2012-01-05 16:17:19

标签: python regex

使用Python和正则表达式我试图在一段以大写字母开头但不在句子开头的文本中找到单词。

我能想到的最好的方法是检查单词之前是否有句号,然后是空格。我很确定我需要使用负面的lookbehind。这是我到目前为止,它将运行但总是不返回任何内容:

(?<!\.\s)\b[A-Z][a-z]*\b

我认为问题可能是在边界\ b中使用[A-Z] [a-z] *,但我真的不确定。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

您的正则表达式似乎有效:

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'...')。

如果您有正则表达式不起作用的特定输入,请将它们添加到您的问题中。

答案 1 :(得分:1)

虽然您专门询问了正则表达式,但考虑列表理解可能会很有趣。它们有时更具可读性(尽管在这种情况下,可能以效率为代价)。这是实现这一目标的一种方法:

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] != '.')]

答案 2 :(得分:0)

尝试使用以下内容循环输入:

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

并捕获第一组。正如您所看到的,也可以使用负前瞻,因为您想要匹配的位置只是行的开头。负面的后视会产生同样的效果。