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

4
使用 Python 和正则表达式,我正在尝试查找文本中以大写字母开头但不在句子开头的单词。
我能想到的最好方法是检查该词是否没有被句号和空格先于。我很确定我需要使用负回顾断言。目前为止,这就是我所拥有的,它会运行,但总是返回空值:
(?<!\.\s)\b[A-Z][a-z]*\b

我认为问题可能出在单词边界 \b 中使用 [A-Z][a-z]*,但我不确定。感谢您的帮助。
3个回答

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

如果您有一些特定的输入,正则表达式无法正常工作,请将它们添加到您的问题中。


谢谢,我没有使用原始字符串前缀。现在完美运行。 - egd

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

0

尝试使用以下代码循环遍历您的输入:

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

并捕获第一组。正如您所看到的,负向先行断言也可以使用,因为您想匹配的位置是除了行首之外的所有内容。负向后行断言将具有相同的效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接