我试图检查列表中的元素是否与另一个元素匹配。但这个问题略有不同。
alist = ['949', '714']
blist = ['(714)824-1234', '(419)312-8732', '(949)555-1234', '(661)949-2867']
我试图将alist的元素与blist相匹配,但只是区域代码部分(在blist中)。这是我目前的代码:
def match_area_codes(alist, blist):
clist =[]
for i in alist:
for j in blist:
if i in j:
clist.append(j)
return clist
代码大部分都有效,除非在列表中的任何其他位置存在与区域代码匹配的字符串。它应该只打印:
['(714)824-1234', '(949)555-1234']
但最终打印
['(714)824-1234', '(949)555-1234', '(661)949-2867']
因为最后一个电话号码中有一个'949'。有办法解决这个问题吗?
答案 0 :(得分:2)
您可以使用regular expression获取(...)
中的部分,并将该部分与alist
进行比较。
import re
def match_area_codes(alist, blist):
p = re.compile(r"\((\d+)\)")
return [b for b in blist if p.search(b).group(1) in alist]
示例:
>>> alist = set(['949', '714'])
>>> blist = ['(714)824-1234', '(419)312-8732', '(949)555-1234', '(661)949-2867']
>>> match_area_codes(alist, blist)
['(714)824-1234', '(949)555-1234']
如果真的想要在没有正则表达式的情况下执行此操作,您可以,例如,找到(
和)
的位置,从而从中获取切片对应于区域代码的字符串。
def match_area_codes(alist, blist):
find_code = lambda s: s[s.index("(") + 1 : s.index(")")]
return [b for b in blist if find_code(b) in alist]
但是,我强烈建议将此作为开始使用正则表达式的机会。它并不是那么难,绝对值得!