我有一个正则表达式 -
query = "(A((hh)|(hn)|(n))?)"
和输入inp = "Ahhwps edAn"
。我想提取所有匹配的模式以及不匹配(剩余),但保留输入的顺序。
输出应该看起来像 - ['Ahh', 'wps ed', 'An']
或['Ahh', 'w', 'p', 's', ' ', 'e', 'd', 'An']
。
我在网上搜索但没有发现任何东西。
我怎么能这样做?
答案 0 :(得分:2)
re.split
方法可以在结果数组中输出捕获的子匹配。
捕获组是由一对非转义括号组成的构造。您的模式在冗余捕获组中很多,re.split
将返回所有这些模式。您需要删除那些不必要的,并将所有捕获组转换为非捕获组,并保留外部括号对以使整个模式成为单个捕获组。
使用
re.split(r'(A(?:hh|hn|n)?)', s)
请注意,输出列表中可能有一个空元素。只需使用filter(None, result)
即可删除空值。
答案 1 :(得分:2)
匹配对象' span()方法对你所追求的内容非常有用。
import re
pat = re.compile("(A((hh)|(hn)|(n))?)")
inp = "Ahhwps edAn"
result=[]
i=k=0
for m in re.finditer(pat,inp):
j,k=m.span()
if i<j:
result.append(inp[i:j])
result.append(inp[j:k])
i=k
if i<len(inp):
result.append(inp[k:])
print result
这是输出的样子。
['Ahh', 'wps ed', 'An']
此技术也处理任何不匹配的前缀和后缀文本。如果您使用inp值为&#34; prefixAhhwps edAnsuffix&#34;,您将获得我认为您想要的输出:
['prefix', 'Ahh', 'wps ed', 'An', 'suffix']
答案 2 :(得分:0)
你可以试试这个:
import re
import itertools
new_data = list(itertools.chain.from_iterable([re.findall(".{"+str(len(i)/2)+"}", i) for i in inp.split()]))
输出:
['Ahh', 'wps', 'ed', 'An']