从子字符串与某个正则表达式匹配的字符串列表中获取子字符串列表

2024-04-26 18:28:13 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题是针对python3.6+的(但对于其他读者,请随意回答低级Python)。你知道吗

我想从每个匹配正则表达式的字符串中提取一个子字符串。你知道吗

假设我有以下几点:

a = ['v-01-001', 'v-01-002', 'v-02-001', 'v-02-002', 'v-02-003', 'v-03-001']

我要匹配v-02-\d\d\d的所有字符串的最后3位,即:

['001', '002', '003']

我天真的尝试:

[x[1] for x in list(map(lambda i: re.search(r'v-02-(\d\d\d)', i), a)) if x]

你能想出更优雅的吗?你知道吗

谢谢


Tags: lambda字符串inremapforsearchif
2条回答

四种方法。你知道吗

第一个是常规的“ole循环”:

li=[]
for s in a:
    m = re.search(r'v-02-(\d\d\d)', s)
    if m:
        li.append(m.group(1))
 # li=['001', '002', '003']

对列表中同一正则表达式的两次调用中的第二次调用:

>>> [re.search(r'v-02-(\d\d\d)', s).group(1) for s in a if re.search(r'v-02-(\d\d\d)', s)]
['001', '002', '003']

三是使用map

>>> [m.group(1) for m in map(lambda s: re.search(r'v-02-(\d\d\d)', s), a) if m]
['001', '002', '003']

最后,您可以使用.join展平列表,然后使用findall

>>> re.findall(r'\bv-02-(\d\d\d)\b', '\t'.join(a))
['001', '002', '003']

或者,使用\nre.M对两个\b

>>> re.findall(r'^v-02-(\d\d\d)$', '\n'.join(a), flags=re.M)
['001', '002', '003']

如果我在写这段代码的话,我可能会按照同样的顺序来写。你知道吗

我想,在旁观者眼中,被认为是更优雅的。我认为最后一个更优雅。


您还可以跳过regex并使用Python的string方法:

>>> prefix='v-02-'
>>> [e[len(prefix):] for e in filter(lambda s: s.startswith(prefix),a)]
['001', '002', '003']

如果在这种情况下,这可能是最快的。你知道吗


2019年12月,将有一个更优雅的选择。如PEP 572中所定义的,您将能够使用赋值语句,以便在一个步骤中分配匹配项并测试匹配项:

[m.group(1) for s in a if (m:=re.search(r'v-02-(\d\d\d)', s))]

你可以这样做:

import re

a = ['v-01-001', 'v-01-002', 'v-02-001', 'v-02-002', 'v-02-003', 'v-03-001']
pattern = re.compile('v-02-(\d{3})$')
print([m.group(1) for m in map(pattern.match, a) if m])

输出

['001', '002', '003']

您还可以使用finditer

print([m.group(1) for ms in map(pattern.finditer, a) for m in ms])

输出

['001', '002', '003']

相关问题 更多 >