【问题标题】:Python regex: Match ALL consecutive capitalized wordsPython regex:匹配所有连续的大写单词
【发布时间】:2014-01-05 19:19:53
【问题描述】:

小问题:

我有一个字符串:

title="Announcing Elasticsearch.js For Node.js And The Browser"

我想找到每个单词正确大写的所有单词对。

所以,预期的输出应该是:

['Announcing Elasticsearch.js', 'Elasticsearch.js For', 'For Node.js', 'Node.js And', 'And The', 'The Browser']

我现在拥有的是这样的:

'[A-Z][a-z]+[\s-][A-Z][a-z.]*'

这给了我输出:

['Announcing Elasticsearch.js', 'For Node.js', 'And The']

如何更改我的正则表达式以提供所需的输出?

【问题讨论】:

  • 听起来您想将最后匹配的位置向后移动一个单词。是否可以将两对而不是一次全部配对?
  • @mtanti 我想应该没问题,我只解析 5-7 个单词的字符串。

标签: python regex python-2.7 python-3.x capitalize


【解决方案1】:

你可以用这个:

#!/usr/bin/python
import re

title="Announcing Elasticsearch.js For Node.js And The Browser TEst"
pattern = r'(?=((?<![A-Za-z.])[A-Z][a-z.]*[\s-][A-Z][a-z.]*))'

print re.findall(pattern, title)

“正常”模式无法匹配重叠的子字符串,所有字符都是一次性创建的。然而,前瞻(?=..)(即“跟随”)只是一个检查并且不匹配。它可以多次解析字符串。因此,如果您在前瞻中放置一个捕获组,您可以获得重叠的子字符串。

【讨论】:

  • 你能解释一下它是如何工作的吗?也许是一个详细的版本?
  • 如果我想限制捕获的组长度怎么办?
【解决方案2】:

如果你现在的 Python 代码是这样的

title="Announcing Elasticsearch.js For Node.js And The Browser"
results = re.findall("[A-Z][a-z]+[\s-][A-Z][a-z.]*", title)

那么您的程序正在跳过奇数对。一个简单的解决方案是在跳过第一个单词后研究模式,如下所示:

m = re.match("[A-Z][a-z]+[\s-]", title)
title_without_first_word = title[m.end():]
results2 = re.findall("[A-Z][a-z]+[\s-][A-Z][a-z.]*", title_without_first_word)

现在只需将结果和结果 2 组合在一起。

【讨论】:

    【解决方案3】:

    可能有更有效的方法来做到这一点,但您可以使用这样的正则表达式:

    (\b[A-Z][a-z.-]+\b)
    

    然后像这样使用这个正则表达式测试:(^[A-Z][a-z.-]+$) 以确保匹配的组(当前)与匹配的组(下一个)匹配。

    工作示例:

    import re
    
    title = "Announcing Elasticsearch.js For Node.js And The Browser"
    matchlist = []
    m = re.findall(r"(\b[A-Z][a-z.-]+\b)", title)
    i = 1
    if m:
        for i in range(len(m)):
            if re.match(r"(^[A-Z][a-z.-]+$)", m[i - 1]) and re.match(r"(^[A-Z][a-z.-]+$)", m[i]):
                matchlist.append([m[i - 1], m[i]])
    
    print matchlist
    

    输出:

    [
        ['Browser', 'Announcing'], 
        ['Announcing', 'Elasticsearch.js'], 
        ['Elasticsearch.js', 'For'], 
        ['For', 'Node.js'], 
        ['Node.js', 'And'], 
        ['And', 'The'], 
        ['The', 'Browser']
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 2012-10-18
      • 2017-11-28
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多