如果數字塊的括號內的數字始終是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))
提取)。
['(\ w +)?\ s * \((\ d +)。*?(\ d +)\)'](https://regex101.com/r/EjgcyR/1) –
這聽起來像你只是想匹配一切。你能擴展你的例子來包含你*不*試圖匹配的文本嗎?此外,數字之前的文本是否總是「補充」或者可能會有變化? – CAustin
+ CAustin我改變了輸入行。這是他們的樣子。 + anubhava:這個選擇只能用'complement'字符串,而不能用其他字符串。我希望他們都被提取出來。 –