我有一个.csv文档,它由几行组成。在每一行中,我都有选项卡分隔的信息,例如,
name_1:ayse t name_2:fatma t birth_date_1:24 t birth_date_2:august t birth_date_3:2018 t death_date:2100 t location:turkey.
这些信息的序列在每一行中可能不相同,并且在每一行都有许多类似的信息。
我想做的是获取字符串中只有"birth_date"信息的特定部分。
我只能得到与出生日期相关的所有3个字符串,如下
['birth_date_1', 'birth_date_2', 'birth_date_3']
借助以下代码。
inputfile = open('ornek_data.csv','r',encoding="utf-8")
for rownum, line in enumerate(inputfile):
pattern_birth = re.compile(r"w*birth_datew*",re.IGNORECASE)
if pattern_birth.search(line) is not None:
a = re.findall("w*birth_datew*", line)
print(a)
然而,我实际上想要的是将下面的列表作为输出进行extact,并将其写入另一个文档中的每一行。
['birth_date_1:24', 'birth_date_2:august', 'birth_date_3:2018']
我尝试了其他几种正则表达式方法,比如下面的方法,但我无法处理。如果有人能帮我解决这个问题,我会很高兴的。
for rownum, line in enumerate(inputfile):
pattern_birth = re.compile(r"w*birth_datew*",re.IGNORECASE)
if pattern_birth.search(line) is not None:
a = re.findall("w*birth_date.*?:$", line)
print(a)
我不会在这里使用regex
。
在't'
上拆分,并检查拆分的是否包含'birth_date'
,简单!:
s = 'name_1:ayse t name_2:fatma t birth_date_1:24 t birth_date_2:august t birth_date_3:2018 t death_date:2100 t location:turkey.'
print([x.strip() for x in s.split('t') if 'birth_date' in x])
# ['birth_date_1:24', 'birth_date_2:august', 'birth_date_3:2018']
使用"w*birth_date.*?s"
或r"birth_date_d:.*?s"
例如:
import re
line = "name_1:ayse t name_2:fatma t birth_date_1:24 t birth_date_2:august t birth_date_3:2018 t death_date:2100 t location:turkey."
print(re.findall("w*birth_date.*?s", line))
输出:
['birth_date_1:24 ', 'birth_date_2:august ', 'birth_date_3:2018 ']
您的正则表达式与您试图提取的内容不匹配,因此需要对其进行扩展。
顺便说一句,您应该只使用re.compile
一次——编译的目的是避免再次解析正则表达式。
也没有必要单独检查是否没有匹配。只要在所有的火柴上循环;如果没有,循环将执行零次。
pat = re.compile(r"bbirth_date_d+:d+",re.IGNORECASE)
with open('ornek_data.csv','r',encoding="utf-8") as inputfile:
for rownum, line in enumerate(inputfile):
for a in pat.findall(line):
print(rownum, a)
w*
没有做任何有用的事情(如果你不在乎它是否在那里,就像*
量词一样,为什么要搜索它?(而b
要求匹配发生在单词边界(如此靠近空白或标点符号,或行首或行尾(。CCD_ 10匹配一个数字,而CCD_。
如果这是一个格式良好的CSV文件,可以使用CSV读取器并打印与startswith('birth_date_')
匹配的字段