2012-02-09 41 views
0

我有字符串。我應該如何在Python中編寫這個正則表達式

st = "12345 hai how r u @3456? Awer12345 7890" 
re.findall('([0-9]+)',st) 

它不應該像:

['12345', '3456', '12345', '7890'] 

我應該得到

['12345','7890'] 

我只取數值

它不應該包含任何其他字符像字母,特殊字符

+1

'[0-9] +''== \ d +' – juliomalegria 2012-02-09 18:17:09

回答

2
In [21]: re.findall(r'(?:^|\s)(\d+)(?=$|\s)', st) 
Out[21]: ['12345', '7890'] 

這裏,

  • (?:^|\s)是字符串或空間的開始相匹配的非捕獲組。
  • (\d+)是一個匹配一個或多個數字的捕獲組。
  • (?=$|\s)是與字符串的末尾相匹配的前瞻斷言,或者空格而不消耗它
+2

與@Ademiban的解決方案相同的問題:這將不會在'123 456'中找到'456',因爲內部空間被第一場比賽「消耗」。 – 2012-02-09 18:20:04

+0

@JanPöschko:很好,謝謝。修正了(通過將最終組轉換爲前瞻斷言)。 – NPE 2012-02-09 18:22:13

+0

@JanPöschko謝謝。它不適用於這個「12345 hai how?u @ 3456?awer12345 7890123ER%345 234 456 789」 – Nava 2012-02-09 18:27:26

2

使用此:(^|\s)[0-9]+(\s|$)模式。 (^|\s)表示您的號碼必須位於字符串的開頭,或者號碼前必須有空格字符。而(\s|$)表示數字後面必須有空格或數字位於字符串的末尾。
正如JanPöschko所說,在123 456中找不到456。如果您的「壞」部分(@,Awer)始終是前綴,則可以使用此(^|\s)[0-9]+模式,並且一切都會正常。它將匹配所有的數字,這些數字在字符串之前或之前只有空格。希望這有助於...

+1

此Wi在'123 456'中找不到'456',因爲內部空間被第一場比賽「消耗」了。 – 2012-02-09 18:19:27

+0

你是對的... – shift66 2012-02-09 18:22:25

11

無需使用正則表達式:

[i for i in st.split(" ") if i.isdigit()] 

我認爲這是比使用正則表達式

+0

'i.isdigit()'...很好。 – phimuemue 2012-02-09 18:22:30

+0

+1不使用正則表達式。 – shift66 2012-02-09 18:27:49

0

你的表達更可讀認定的數字全部序列,不管是什麼圍繞着他們。您需要包含序列前後內容的規範以獲得您想要的行爲:

re.findall(r"[\D\b](\d+)[\D\b]", st) 

會做你想做的。在英文中,它表示「匹配一個或多個由非數字字符圍繞的數字的所有序列。或一個單詞邊界」

+0

當他想要['12345','7890']時返回['3456','12345']。我越來越相信我的觀點,即正則表達式比它們的價值更麻煩,除非它們微不足道。 – DSM 2012-02-09 18:28:05

3

科裏的解決方案是真正走在這裏的正確方法,但因爲這個問題沒問正則表達式,這裏是一個正則表達式的解決方案,我認爲這是比別人更簡單:

re.findall(r'(?<!\S)\d+(?!\S)', st) 

和一個解釋:

(?<!\S) # Fail if the previous character (if one exists) isn't whitespace 
\d+  # Match one or more digits 
(?!\S) # Fail if the next character (if one exists) isn't whitespace 

一些例子:

>>> re.findall(r'(?<!\S)\d+(?!\S)', '12345 hai how r u @3456? Awer12345 7890') 
['12345', '7890'] 
>>> re.findall(r'(?<!\S)\d+(?!\S)', '12345 hai how r u @3456? Awer12345 7890123ER%345 234 456 789') 
['12345', '234', '456', '789'] 
+0

用於扭曲的雙負邏輯。邪惡。 :) – zx81 2014-08-08 10:37:34

相關問題