我们说我们有这个数据提取:
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).*$
然而,这也将给我巴黎是目的地的第二行。
我想这个想法是:
我可以使用 正则表达式
的任何解决方案答案 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)