2016-09-19 47 views
2

我有以下字符串Python的正則表達式刪除號碼和數字與punctaution

line = "1234567 7852853427.111 https://en.wikipedia.org/wiki/Dictionary_(disambiguation)" 

我想刪除的號碼1234567個7852853427.111使用常規expresisions

我有這個重新 n第=應用re.sub( 「^ \ d + \ s | \ s \ d + \ s | \ s \ d \ w \ d | \ s \ d + $」,「」,line)

但它沒有做我希望它會做的這樣做。

任何人都可以指向正確的方向嗎?

+1

上*爲什麼*您嘗試沒有工作的一些寬鬆的言論:開始錨似乎是正確的,但那個結束錨不是。到目前爲止,它不是弦的結尾!另外,這些'|'的所有**將整個正則表達式分成不同的部分 - 也就是說,第一部分匹配字符串的開頭,但第二部分不匹配。您可能想了解如何創建帶圓括號的組。 – usr2564301

+0

這個字符串從哪裏來? HTML解析? – alecxe

+1

大多數當前的建議或多或少都會殺死字符串中的每個數字序列。你能否合理地確信,你想保留的部分永遠不會有數字?去掉「前兩個單詞」怎麼樣?或者「http://'」之前的所有內容?您的標題提到*標點符號* - 開頭的「1..2」應該刪除嗎? – usr2564301

回答

2

您可以使用:

>>> line = "1234567 7852853427.111 https://en.wikipedia.org/wiki/Dictionary_(disambiguation)" 
>>> print re.sub(r'\b\d+(?:\.\d+)?\s+', '', line) 

https://en.wikipedia.org/wiki/Dictionary_(disambiguation) 

正則表達式\b\d+(?:\.\d+)?\s+將匹配後跟1個或多個空格的整數或十進制數。 \b用於文字邊界。

+0

啓動時的錨點會更安全一些:) – usr2564301

+1

'\ b'將起作用,但'^'不會因爲'7852853427.111'不在開頭。 – anubhava

+0

啊,因爲你分別考慮每個數字。我想知道爲什麼 - 可能OP需要澄清或添加多個示例。我實際上正在考慮像'^ [\ d。\ s] +'......一樣直截了當的事情...... @ – usr2564301

1

這裏有一個非正則表達式的方法,如果您正則表達式的要求是不完全嚴格,使用itertools.dropwhile

>>> ''.join(dropwhile(lambda x: not x.isalpha(), line)) 
'https://en.wikipedia.org/wiki/Dictionary_(disambiguation)' 
0

我想這是你想要什麼:

nline = re.sub("\d+\s\d+\.\d+", "", line) 

它從刪除號碼線。如果你想保留「http ...」前面的空格,你的第二個參數當然應該是「」。

如果你也想記錄個人數字字符串,你可以把他們在羣體像這樣:

>>> result = re.search("(\d+)\s(\d+\.\d+)", line) 
>>> print(result.group(0)) 
1234567 7852853427.111 
>>> print(result.group(1)) 
1234567 
>>> print(result.group(2)) 
7852853427.111 

學習和實踐正則表達式的好方法是regex101

0

儘管您要求提供正則表達式,但更好的解決方案是使用str.split,假設您的字符串始終採用格式{number} {number} {hyperlink}

由於@godaygo said,您可以使用此:

line = line.split()[-1] 

該字符串將在空白分裂,我們選擇最後一個子。

如果您要訪問的所有部件(假設總有三層),你可以使用它代替:

num1, num2, url = line.split() 
相關問題