簡體   English   中英

從逗號分隔的txt文件中提取正則表達式字符串

[英]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.

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