2017-08-01 73 views
5

我正在尋找匹配特定模式的字符串中的單詞。 問題是,如果單詞是電子郵件地址的一部分,則應該忽略它們。正則表達式 - 匹配模式中的單詞,電子郵件地址除外

爲了簡化「合適詞」\w+\.\w+的模式 - 一個或多個字符,一個實際時段和另一系列字符。

導致問題的句子例如是a.a b.b:c.c [email protected]

目標是僅匹配[a.a, b.b, c.c]。在我構建的大多數正則表達式中,e.e也會返回(因爲我使用了一些字邊界匹配)。

例如:

>>> re.findall(r"(?:^|\s|\W)(?<[email protected])(\w+\.\w+)([email protected])\b", "a.a b.b:c.c [email protected]") ['a.a', 'b.b', 'c.c', 'e.e']

我怎麼能只匹配中不包含 「@」 的話呢?

+0

而不是試圖得到一個聰明的正則表達式,可能首先清理字符串?第一條帶\ w + @ \ w +然後處理。我使用python完成了大量的ETL工作,而且通常清理垃圾,然後拆分/處理數據更容易/更快。 – sniperd

+0

http:// www。rexegg.com/regex-best-trick.html#thetrick –

回答

2

我肯定會先清理它並簡化正則表達式。

首先我們必須

words = re.split(r':|\s', "a.a b.b:c.c [email protected]") 

然後過濾掉,在他們有一個@的話。

words = [re.search(r'^(([email protected]).)*$', word) for word in words] 
1

正確解析電子郵件地址與正則表達式是非常辛苦的,但你的簡單情況下,使用Word的一個簡單的定義〜\w\.\w和電子郵件〜any sequence that contains @,你可能會發現這個正則表達式做你需要的東西:

>>> re.findall(r"(?:^|[:\s]+)(\w+\.\w+)(?=[:\s]+|$)", "a.a b.b:c.c [email protected]") 
['a.a', 'b.b', 'c.c'] 

這裏的訣竅不是關注下一個或上一個單詞的內容,而是關注當前捕獲的單詞的樣子。

另一個訣竅是正確定義單詞分隔符。 之前這個詞我們將允許多個空格,:和字符串開始,消耗這些字符,但不捕獲它們。 之後我們需要的詞幾乎相同(除了字符串結束,而不是開始),但是我們不會消耗這些字符 - 我們使用一個超前斷言。

1

您可以用\[email protected]\S+\.\S+和匹配和捕獲你在所有其他情況下(\w+\.\w+)模式匹配的電子郵件般子。使用re.findall只返回捕獲的值,並篩選出空項(他們將在re.findall結果時,有一個電子郵件匹配):

import re 
rx = r"\[email protected]\S+\.\S+|(\w+\.\w+)" 
s = "a.a b.b:c.c [email protected]" 
res = filter(None, re.findall(rx, s)) 
print(res) 
# => ['a.a', 'b.b', 'c.c'] 

Python demo

查看regex demo

相關問題