【问题标题】:Find words with capital letters not at start of a sentence with regex使用正则表达式查找不在句子开头的大写字母单词
【发布时间】:2012-01-06 03:03:25
【问题描述】:

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

我能想到的最好方法是检查单词前面是否没有句号,然后是空格。我很确定我需要使用负面的lookbehind。这是我到目前为止所拥有的,它会运行但总是什么都不返回:

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

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

感谢您的帮助。

【问题讨论】:

    标签: python regex


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,我没有使用原始字符串前缀。现在完美运行。
    【解决方案2】:

    尽管您专门要求使用正则表达式,但考虑列表推导式可能会很有趣。它们有时更具可读性(尽管在这种情况下,可能以效率为代价)。这是实现此目的的一种方法:

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

    【讨论】:

      【解决方案3】:

      尝试循环输入:

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

      并捕获第一组。如您所见,也可以使用负前瞻,因为您要匹配的位置是除行首之外的所有位置。消极的回顾会产生同样的效果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        相关资源
        最近更新 更多