正则表达式:当某些列等于某些值时捕获一条线

时间:2017-11-22 20:36:57

标签: python regex

我们说我们有这个数据提取:

ID,from,to,type,duration
1,paris,berlin,member,12
2,berlin,paris,member,12
3,paris,madrid,non-member,10

我想在 from = paris type = member 时检索该行。 这意味着在这个例子中我只有:

1,paris,berlin,member,12

满足这些规则。我只想用正则表达式做这件事。我还在学习,我只能得到这个:

^.*(paris).*(member).*$

然而,这也将给我巴黎是目的地的第二行。

我想这个想法是:

  • 用逗号分隔。
  • 检查第二项是否等于' paris'
  • 检查第四项是否等于'会员',或者甚至检查是否有'会员'在那一行,因为这部分没有混淆。

我可以使用 正则表达式

的任何解决方案

5 个答案:

答案 0 :(得分:1)

使用[^,]*代替.*来匹配不包含逗号分隔符的字符序列。对于要匹配行时要跳过的每个字段,请使用此选项。

^[^,]*,paris,[^,]*,member,

请注意,与使用csv模块相比,这是一个非常脆弱的机制,因为如果您有任何包含逗号的字段,它将会中断(csv模块理解引用字段以保护分隔符)。

答案 1 :(得分:1)

这应该这样做:

^.*,(paris),.*,(member),.*$

答案 2 :(得分:1)

你可以试试这个:

import re
s = """
 ID,from,to,type,duration
 1,paris,berlin,member,12
 2,berlin,paris,member,12
 3,paris,madrid,non-member,10
"""
final_data = re.findall('\d+,paris,\w+,member,\d+', s)

输出:

['1,paris,berlin,member,12']

但请注意,最佳解决方案是阅读文件并使用字典:

import csv
l = list(csv.reader(open('filename.csv')))
final_l = [dict(zip(l[0], i)) for i in l[1:]]
final_data = [','.join(i[b] for b in l[0]) for i in final_l if i['from'] == 'paris' and i['type'] == 'member']

答案 3 :(得分:1)

正如许多人所指出的,我会使用csv将其读入字典。但是,如果你坚持使用正则表达式,这应该有效:

[0-9]+\,paris.*[^-]member.*

答案 4 :(得分:1)

试试这个。

import re
regex = r"\d,paris,\w+,member,\d+"
str = """ID,from,to,type,duration
1,paris,berlin,member,12
2,berlin,paris,member,12
3,paris,madrid,non-member,10"""
str = str.split("\n")

for line in str:
    if (re.match(regex, line)):
        print(line)