2017-10-05 76 views
1

我有一些像下面的數字和字符串。有些人只有數字,而有些人也有一些字符串以及之前:如何使用Python選擇變量正則表達式?

'abc'   (17245...64590) 
'cde'   (12244...67730) 
'dsa'   complement (12345...67890) 

我想提取兩種格式有和沒有數字。所以,前兩行應該只包含數字,而第三行應該包含數字前面的字符串。

我正在使用此命令來實現此目的。

result = re.findall("\bcomplement\b|\d+", line) 

任何想法,如何去做。 預計產量會是這樣的:

17245, 64590 
12244, 67730 
complement, 12345, 67890 
+0

['(\ w +)?\ s * \((\ d +)。*?(\ d +)\)'](https://regex101.com/r/EjgcyR/1) –

+2

這聽起來像你只是想匹配一切。你能擴展你的例子來包含你*不*試圖匹配的文本嗎?此外,數字之前的文本是否總是「補充」或者可能會有變化? – CAustin

+0

+ CAustin我改變了輸入行。這是他們的樣子。 + anubhava:這個選擇只能用'complement'字符串,而不能用其他字符串。我希望他們都被提取出來。 –

回答

0

如果數字塊的括號內的數字始終是2和他們分開與1+點使用

re.findall(r'\s{2,}(?:(\w+)\s*)?\((\d+)\.+(\d+)\)', s) 

regex demo。和sample Python demo

import re 
s= ''''abc'   (17245...64590) 
'cde'   (12244...67730) 
'dsa'   complement (12345...67890)''' 
rx = r"\s{2,}(?:(\w+)\s*)?\((\d+)\.+(\d+)\)" 
for x in re.findall(rx, s): 
    print(", ".join([y for y in x if y])) 

詳細

  • \s{2,} - 2個或更多的空格
  • (?:(\w+)\s*)? - 的可選順序:
    • (\w+) - 第1組:一個或多個單詞chars
    • \s* - 0+空格
  • \( - 一個(
  • (\d+) - 組2:一個或多個數字
  • \.+ - 1或多個點
  • (\d+) - 第3組:一個或多個數字
  • \) - a ) char。

如果括號內的數字塊的數量可以改變,你可以使用

import re 
s= ''''abc'   (17245...64590) 
'cde'   (12244...67730) 
'dsa'   complement (12345...67890)''' 
for m in re.finditer(r'\s{2,}(?:(\w+)\s*)?\(([\d.]+)\)', s): 
    res = [] 
    if m.group(1): 
     res.append(m.group(1)) 
    res.extend(re.findall(r'\d+', m.group(2))) 
    print(", ".join(res)) 

兩個Python的網頁摘要輸出:

17245, 64590 
12244, 67730 
complement, 12345, 67890 

online Python demo。注意它可以匹配括號內任意數量的數字塊,並且它假定列1和列2之間至少有2個空格字符。

也請參閱regex demo。與第一組的區別在於沒有第三組,第二組和第三組被替換爲一個第二組([\d.]+),其捕獲1個或更多個點或數字(數字稍後用re.findall(r'\d+', m.group(2))提取)。

相關問題