簡體   English   中英

Python正則表達式:匹配所有連續的大寫單詞

[英]Python regex: Match ALL consecutive capitalized words

簡短的問題:

我有一個字符串:

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']

如何更改我的正則表達式以提供所需的輸出?

你可以用這個:

#!/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)

“正常”模式不能匹配重疊的子串,所有字符都是一次性建立的。 但是,前瞻(?=..) (即“后跟”)只是一個檢查並且不匹配。 它可以多次解析字符串。 因此,如果將捕獲組放在前瞻中,則可以獲得重疊的子串。

可能有一種更有效的方法,但你可以使用這樣的正則表達式:

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

然后迭代捕獲組,如此測試使用此正則表達式: (^[AZ][az.-]+$)以確保匹配的組(當前)匹配匹配的組(下一個)。

工作范例:

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']
]

如果您目前的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)

現在只需將結果和result2結合起來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM