[英]Regex string extraction from txt file separated by comma
我有一個具有以下格式的txt 文件。
name:,john smith,
age:,23
birth date:,/ /
variable1,foo,1,bar
variable2,foo,2,bar
variable3,foo,5,bar
variable4,foo,19,bar
您可能已經注意到,前 3 行的格式為<string>:,
或<string>:, ,
。 在其余行中,字符串和值用 3 個逗號分隔
我一直在嘗試應用正則表達式,例如以下代碼: re.findall('(.*?)\,(.*)',text)
但由於我對正則表達式的理解非常有限,我無法弄清楚如何提取txt 文件中的所有數據。
我想通過正則表達式提取所有數據的原因是將 pivot 值數據放入單行中,其中變量名稱構成列,如下所示:
name age birth date variable1_foo variable2_foo variable3_foo variable4_foo
johnsmith 34 / / 1 2 5 19
有什么解決辦法嗎? 非常感謝您的幫助。
假設您希望將第一個冒號或逗號作為鍵,並將 rest 作為值...
^([^,:]+)[,:]*+(.*)$
我在這里放了一些在線示例。 https://rubular.com/r/YLlHaXNKvEHHaN
您在問題中提供的示例如何非常違反直覺...您沒有提到例如-如果鍵后跟,foo 它將轉換為 _foo 並且如果值后跟,bar 將被忽略。
正則表達式不要 go 像這樣:我想要一個做一些我忘記指定的正則表達式,它必須是一個正則表達式......
您可以使用 2 個捕獲組來獲取所需結果中顯示的值,並根據需要將第二組的,
替換為_
。
在演示中,我已將\n
添加到否定字符 class 以防止在示例中跨越換行符。
^(.+?(?=:,)|[^,]+,[^,]+):?,([^,]+)
^
字符串開頭(
捕獲組 1
.+?(?=:,)
匹配 1+ 次盡可能少的字符,直到您可以斷言:,
直接在右側|
或者[^,]+,[^,]+
匹配除 之外的任何字符 1+ 次,
然后匹配,
並再次匹配除 之外的任何字符 1+ 次,
):?
關閉第 1 組並匹配可選:
,
字面匹配([^,]+)
捕獲組 2 ,匹配除 之外的任何字符 1+ 次,
例如,您可以從組中收集所有值並在組 2 上執行替換。
# data = read the whole file here
pattern = r"^(.+?(?=:,)|[^,\n]+,[^,\n]+):?,([^,\n]+)"
group1 = []
group2 = []
matches = re.finditer(pattern, data, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
group1.append(match.group(1).replace(",", "_"))
group2.append(match.group(2).replace(" ", ""))
df = pd.DataFrame([group1, group2])
print(df.to_string(index=False, header=False))
Output
name age birth date variable1_foo variable2_foo variable3_foo variable4_foo
johnsmith 23 // 1 2 5 19
請注意,約翰的年齡從 23 歲到 34 歲。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.