我試圖使用re.search(或re.findall)來解釋一行,并通過一個值來改變關鍵詞。
我的例子字串是:
line = 'Text1 <<ALTER, variable = Ion1>> Text2 <<ALTER, variable = Value1> >
'
當Ion1的值為'Na',Value1的值為1.0時,我想得到的回報是
processedline = 'Text1 Na Text2 1.0'
為了做到這一點,我嘗試了以下代碼:
result = re.search('<<ALTER(.*)>> ', line)
aux_txt = result.group(1).split('='/span>)
var = aux_txt[-1].strip()
value = ParameterDictionary[var]
processedline = re.sub('<<ALTER(.*)>>', str(value), line, flags=re.DOTALL)
然而,我得到的回傳,對于變數result,是', variable = Ion1>> Text2 <<ALTER, variable = Value1',也就是說,它沒有獨立處理兩個關鍵詞。
誰有一些想法?謝謝!
uj5u.com熱心網友回復:
這是因為你的regex匹配了整個字串(直到最后一個>>),而不是匹配到Ion1之后第一次出現的>>。你需要使用lazy運算子和你的.*來限制匹配。
.*?的作用是這樣的。它在零到無限次之間匹配前一個標記,次數越少越好,并根據需要進行擴展(懶惰)
下面是一個例子。
下面是一個帶有解釋的例子。https://regex101.com/r/oKyOIn/1
uj5u.com熱心網友回復:
使用.*過于寬泛,捕獲<<ALTER和>>之間的一切。為什么不使用一個更具體的鉸鏈呢?
>>> re.findall(r"<<ALTER, variable = (w )> > ", line)
['Ion1'/span>, 'Value1'/span>]
uj5u.com熱心網友回復:
Python re.search for multiple values in the same line
re.search對于這個任務來說是錯誤的工具,它確實回傳第一個(最左邊的)匹配,或者如果沒有找到匹配,則None。你應該使用re.finditer,它提供了Match物件的迭代器,或者re.findall,它提供了strs或tuples的 list。
另外,正如已經指出的,你需要改變你的模式<<ALTER(.*)>>,因為它確實匹配太多,你可以使用非貪婪的版本,即
<<ALTER(.*?)>>
或者如果>里面不允許有<<和>>的束縛,如下所示
<<ALTER([^>]*)>>
uj5u.com熱心網友回復:
非常感謝! 它像這樣完美地作業:
import re
ParameterDictionary = {'Ion1': 'Na', 'Value1': '1.0'}。
line = 'Text1 <<ALTER, variable = Ion1>> Text2 <<ALTER, variable = Value1> >
'
result = re.findall(r'<<ALTER, variable = (w )>> ', line)
for txt in result:
aux_txt = f'<<ALTER, variable = {txt}> >'
值=ParameterDictionary[txt]
line = re.sub(aux_txt, str(value), line, flags=re.DOTALL)
uj5u.com熱心網友回復:
你需要在<<ALTER,變數=和>>里面捕獲一個或多個單詞字符(字母數字包括下劃線),然后在re.sub方法替換引數中使用一個可呼叫變數:
參見Python演示:
import re
ParameterDictionary = {'Ion1': 'Na', 'Value1': '1.0'}。
line = 'Text1 <<ALTER, variable = Ion1>> Text2 <<ALTER, variable = Value1> >
'
rx = r'<<ALTER, variable = (w )>>'
result = re.sub(rx, lambda x: ParameterDictionary.get(x.group(1), x.group()), line)
print(result)
# => Text1 Na Text2 1.0。
在這里,
<<ALTER, variable = (w )>>匹配<<ALTER, variable =, space, 然后(w )捕獲到第一組的任何一個或多個單詞字符,然后>>被匹配- 該匹配被傳入
re.sub中的一個lambda運算式,作為x,并且ParameterDictionary.get(x.group(1), x.group())要么按找到的鍵回傳相應的值,要么回傳整個匹配(x.group())。
uj5u.com熱心網友回復:
在re.sub內使用組來捕獲似乎是你正在尋找的東西。re.sub接受一個函式作為repl(替換字串引數)。該函式是以匹配物件為引數進行評估的。參見docs.
>>> param_dict = {'Ion1'/span>: 'Na'/span>, 'Variable1'/span>: '1.0'}。
>>> re.sub(r'<<ALTER, variable = ([wd] )>> ', lambda m: param_dict[m. group(1)], line)
'Text1 Na Text2 1.0
'
重碼組([wd] )可以適應你期望找到的那種值。
在Python中使用原始字串(以r'開頭)作為重詞是很好的做法,可以讓你免于頭痛。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/332391.html
標籤:
