python regex:提取列表元素,每个元素都匹配多个模式

时间:2018-11-03 09:17:14

标签: python regex

我对python完全陌生。假设我有如下列表。

 somelist =  
['AAAA  1234   SD OXD',
 'AAAB  2342   DF BDD',
 'ERTE  3454   RE DFD',
 'GWED  1234   SD TCD',
 'AAAA  2353   SD MKX',
 'VERD  1234   IO ERT']

我想提取与位置7-10处的“ 1234”和位置14-15处的“ SD”都匹配的元素(仅作为示例,可以是位置的任何组合,介于两者之间)。结果将如下。

['AAAA  1234   SD OXD', 'GWED  1234   SD TCD']

我现在正在做的是将filter()函数嵌套在另一个函数中。

x = filter(lambda x: re.match('1234', x[6:10]), filter(lambda r: re.match('SD', r[13:15]), somelist))

这有效,但是看起来很笨拙。有人可以帮助您获得更优雅,更快的解决方案吗?该列表可能包含数百万个元素(来自文件中的行)。

关于搜索/匹配任何模式/正则表达式(匹配A或B )的讨论很多。这是为了匹配A和B ,它必须与 OR 问题一样常见。显然,如果我想在不同位置匹配A,B和C以及... ,将会变得混乱。

  

更新:谢谢。我最初的问题可能还不够清楚。基本上,这是一个'元素必须匹配所有几种模式   给定职位的问题。

     

尤其是受到 Kcorlidy 的响应的启发,我给了它一些快速   镜头,并且这些镜头有效(并且.的确意味着'anything',除了   \n(根据手册):

     

要在所述位置匹配“ 1234”和“ SD”:

     

filter(lambda x: re.search(r'.{6}1234.{3}SD', x), somelist)

     

分别在0:4和13:15匹配“ AAAA”和“ SD”:

     

filter(lambda x: re.search(r'.{0}1234.{9}SD', x), somelist)

     

带回家的消息是大括号中的数字   似乎是指距结尾处“距离”(字符数)   以前的模式(从开头算起的距离,即^,如果是   对于第一个图案),而不是相关图案的开始位置。   这就是整个重点。简单的东西-这可能就是为什么更多的东西   对匹配A或B 感兴趣,而不是对此匹配A和   B 问题。

3 个答案:

答案 0 :(得分:1)

您确定需要复杂的正则表达式吗?您还可以使用:

[x for x in somelist if x[5:9] == '1234' and x[10:12] == 'SD' ]
# ['AAAA 1234 SD OXD', 'GWED 1234 SD TCD']

答案 1 :(得分:0)

我也不确定RegEx是最好的解决方案,但是如果您要做想要这样做,这将奏效:

>>> regex = re.compile('.{6}1234   SD.*')
>>> x=re.findall("\n".join(somelist))
['AAAA  1234   SD OXD', 'GWED  1234   SD TCD']

答案 2 :(得分:0)

为什么要使用两个正则表达式,实际上它可以在一个正则表达式中完成

import re

somelist = [ 
     'AAAA  1234   SD OXD',
     'AAAB  2342   DF BDD',
     'ERTE  3454   RE DFD',
     'GWED  1234   SD TCD',
     'AAAA  2353   SD MKX',
     'VERD  1234   IO ERT',
     'AAAA 2353   SD MKX',
     'AAAA  2353  SD MKX']

print(list(filter(lambda x : re.search(r".{6}1234\s{3}SD",x) ,somelist)))
# ['AAAA  1234   SD OXD', 'GWED  1234   SD TCD']