簡體   English   中英

正則表達式_如何從一行中提取幾個匹配的模式?

[英]Regular Expression_How to extract several matching patterns from a line?

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

我不會在這里使用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要求匹配項出現在單詞邊界處(因此相鄰)空格或標點符號,或行的開頭或結尾)。 \\d匹配一個數字,而:匹配自己。

如果這是格式正確的CSV文件,則可以改用CSV閱讀器並打印與startswith('birth_date_')匹配的字段

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM