正则表达式_如何从一行中提取几个匹配的模式?

时间:2018-07-29 17:39:00

标签: python regex

我有一个.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)

3 个答案:

答案 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_')匹配的字段