我有一个.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”信息。
我设法只获得了与出生日期相关的所有三个字符串,如下所示:
['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_date\w*",re.IGNORECASE)
if pattern_birth.search(line) is not None:
a = re.findall("\w*birth_date\w*", line)
print(a)
不过,我真正想要的是将列表下面的内容作为输出,并将其写在另一文档的每一行中。
['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_date\w*",re.IGNORECASE)
if pattern_birth.search(line) is not None:
a = re.findall("\w*birth_date.*?:$", line)
print(a)
答案 0 :(得分:1)
在这里我不会使用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']
答案 1 :(得分:0)
使用training set score: 0.892
test set score: 0.876
或"\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))
答案 2 :(得分:0)
您的正则表达式与您尝试提取的正则表达式不匹配,因此您需要对其进行扩展。
顺便说一句,您只应该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
要求匹配项发生在单词边界处(因此必须与空格或标点相邻,或与行的开头或结尾相邻)。 \d
与数字匹配,而:
与自身匹配。
如果这是格式正确的CSV文件,则可以改用CSV阅读器并打印与startswith('birth_date_')
匹配的字段