用正则表达式查找句首不是大写字母的单词

4 投票
3 回答
5222 浏览
提问于 2025-04-17 09:36

我正在用Python和正则表达式(regex)来找一些文本中以大写字母开头的单词,但这些单词不是句子的开头。

我想到的最好办法是检查这个单词前面是不是有一个句号和一个空格。我觉得我需要用到负向前查找(negative lookbehind)。这是我目前的代码,它可以运行,但总是返回空:

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

我觉得问题可能出在使用了[A-Z][a-z]*这个部分,放在单词边界\b里面,但我真的不太确定。

谢谢你的帮助。

3 个回答

0

试着用下面的代码来遍历你的输入:

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

然后捕捉第一个组。你会发现,负向前瞻也可以用,因为你想匹配的位置是除了行首以外的所有地方。负向后瞻也会有同样的效果。

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

你的正则表达式看起来是有效的:

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

如果你有一些特定的输入,正则表达式无法处理,请把这些例子加到你的问题里。

撰写回答