[英]How to extract a numeric value from a line of text with a regular expression?
[英]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.