簡體   English   中英

從字符串中獲取特定信息

[英]Get particular information from a string

我想在Python中使用RegEx從fstr獲取name的值。 我嘗試如下,但找不到預期的結果。

任何幫助將不勝感激。

fstr = "MCode=1,FCode=1,Name=XYZ,Extra=whatever" #",Extra=whatever" this portion is optional
myobj = re.search( r'(.*?),Name(.*?),*(.*)', fstr, re.M|re.I)
print(myobj.group(2))

您可能不相信,但實際問題是正則表達式中的,* 它使匹配,可選的。 因此,正則表達式中的第二個捕獲組不匹配任何內容( .*?表示零到無限制之間的匹配,並且延遲進行匹配),並檢查下一個項目,* ,也表示match ,零次或多次。 因此它匹配零次,最后捕獲組匹配字符串的其余部分。

如果要修復RegEx,只需在逗號后刪除* ,就像這樣

myobj = re.search( r'(.*?),Name(.*?),(.*)', fstr, re.I)
print(myobj.group(2))
# =XYZ

在線RegEx演示(錯誤)

在線RegEx演示(修復后)

正則表達式可視化

Debuggex演示

但是,正如其他答案所示,您不必創建其他捕獲組。

順便說一句,我喜歡僅在特別需要時才使用RegEx。 在這種情況下,如果沒有RegEx,我會像這樣解決它

fstr = "MCode=1,FCode=1,Name=XYZ,Extra=whatever"
d = dict(item.split("=") for item in fstr.split(","))
# {'FCode': '1', 'Extra': 'whatever', 'Name': 'XYZ', 'MCode': '1'}

現在,我已經掌握了所有信息,可以像這樣訪問它們

print d["Name"]
# XYZ

簡單吧? :-)

編輯:如果要對一百萬條記錄使用相同的正則表達式,則可以通過預編譯RegEx來稍微提高性能,如下所示

import re
pattern = re.compile(r"Name=([^,]+)", re.I)
match = re.search(pattern, data)
if match:
    match.group(1)

您可以按照以下步驟進行操作:

import re

fstr = "MCode=1,FCode=1,Name=XYZ,Extra=whatever"

myobj = re.search( r'Name=([^,]+)', fstr, re.M|re.I)

>>> print myobj.group(1)
XYZ

試試吧

rule = re.compile(r"Name=(?P<Name>\w*),")
res = rule.search(fstr)
res.group("Name")

暫無
暫無

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

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