有没有一种简单的方法可以找到匹配字符串中的模式并提取它的子字符串?

时间:2016-02-27 04:34:27

标签: algorithm python-3.x

我知道这是开放式的,但我不知道该怎么做。

假设我有字符串"FDBFBDFLDJVHVBDVBD",并希望找到以"BDF"开头并以"EFG""EDS"结尾的每个子字符串,是否有简单的方法吗?

3 个答案:

答案 0 :(得分:1)

您可以使用re.finditer

>>> import re
>>> s = "FDBFBDFLDJVHVBDVBDBDFEFGEDS"
>>> print [s[a.start(): a.end()] for a in re.finditer('BDF', s)]
['BDF', 'BDF'] 

答案 1 :(得分:1)

  

查找以" 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']

.*?并不贪心,因此选择了最短的子串。移除?,以获得最长的匹配。

答案 2 :(得分:0)

由于现在还没有正则表达式专家,我将提出这个解决方案(顺便说一下,我在你的字符串的末尾添加了"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']