我知道這是開放式的,但我不知道如何去做。有沒有一種簡單的方法來查找匹配字符串中的模式並提取它的子字符串?
說我有串"FDBFBDFLDJVHVBDVBD"
,並希望找到每個子字符串的東西,如"BDF"
開始,並用"EFG"
或"EDS"
結束時,有一個簡單的方法來做到這一點?
我知道這是開放式的,但我不知道如何去做。有沒有一種簡單的方法來查找匹配字符串中的模式並提取它的子字符串?
說我有串"FDBFBDFLDJVHVBDVBD"
,並希望找到每個子字符串的東西,如"BDF"
開始,並用"EFG"
或"EDS"
結束時,有一個簡單的方法來做到這一點?
看到,因爲沒有正則表達式的專家在這裏沒有,我會提出這個解決方案(順便說一句,我添加"BDFEFGEDS"
到您的字符串的末尾,以便它會給一些成果):
import re
s = "FDBFBDFLDJVHVBDVBDBDFEFGEDS"
endings = ['EFG', 'EDS']
matches = []
for ending in endings:
match = re.findall(r'(?=(BDF.*{0}))'.format(ending), s)
matches.extend(match)
print matches
給出結果:
['BDFLDJVHVBDVBDBDFEFG', 'BDFEFG', 'BDFLDJVHVBDVBDBDFEFGEDS', 'BDFEFGEDS']
您可以使用re.finditer
>>> import re
>>> s = "FDBFBDFLDJVHVBDVBDBDFEFGEDS"
>>> print [s[a.start(): a.end()] for a in re.finditer('BDF', s)]
['BDF', 'BDF']
發現每串子,與類似「BDF」開始,或者用「EFG」或「EDS」
這對正則表達式的工作結束。提取所有這樣子的一個列表:
import re
substrings = re.findall(r'BDF.*?E(?:FG|DS)', text)
如果一個子可能包含新行再通flags=re.DOTALL
。
實施例:
>>> re.findall(r'BDF.*?E(?:FG|DS)', "FDBFBDFLDJVHVBDVBDBDFEFGEDS")
['BDFLDJVHVBDVBDBDFEFG']
.*?
是不貪,因此最短的子串被選擇。刪除?
,以獲得最長的匹配。
輸入中既沒有「EFG」也沒有「EDS」,即輸入中沒有與模式匹配的子字符串。 – jfs