[英]Replace all occurrences matching regular expression in the first word of a line
我想解析一個ASCII文件並轉義“。” 每行第一個單詞中的字符。 這是一個例子:
line='DXa0.Xa1.a2 p1 p2 deviceName a=157.585p b=54.46u $x=106.124 $y=107.996 $a=0'
我想生產以下內容
DXa0\.Xa1\.a2 p1 p2 deviceName a=157.585p b=54.46u $x=106.124 $y=107.996 $a=0
我可以為此示例運行以下命令:
re.sub(r"\.", '\\.', line, count=2 )
但這假定為2“。” 單詞中的字符,不保證。 我現在找到的解決方法是
re.sub(r"\.", '\\.', line.split(' ', 1)[0]) + ' ' + line.split(' ', 1)[1]
它會產生預期的結果,但這並不漂亮,我確信有更好的方法。
你必須堅持re
嗎?
沒有它很容易:
p = line.partition(' ')
escaped = p[0].replace(r'.', r'\.') + p[1] + p[2]
escaped
Out:
'DXa0\\.Xa1\\.a2 p1 p2 deviceName a=157.585p b=54.46u $x=106.124 $y=107.996 $a=0'
您可以通過re
使用正則表達式來匹配第一個單詞,直到第一個空格在第一個非空格字符和一個lambda表達式作為替換參數之后的第一個空格:
re.sub(r"^\s*\S+", lambda x: x.group().replace('.', r'\.'), s)
在這里, ^\\s*\\S+
匹配任何0+空格,然后匹配字符串開頭的1 +非空格,然后全部.
在該匹配中( x.group()
)替換為\\.
char序列。
請參閱Python演示 。
如果您安裝PyPi regex
模塊 ,您將能夠通過單個regex.sub
調用實現所需的regex.sub
:
import regex
s = 'DXa0.Xa1.a2 p1 p2 deviceName a=157.585p b=54.46u $x=106.124 $y=107.996 $a=0'
rx = r'\G[^\s.]*\K\.'
print(regex.sub(rx, r'\\.', s))
請參閱Python演示 。 另外,請參閱此正則表達式演示 。
細節
\\G
- 字符串的開頭或上一次成功匹配的結束 [^\\s.]*
- 0或多於一個空格(其他字符\\s
)和一個點(方括號內的點僅匹配一個.
CHAR) \\K
匹配重置運算符,丟棄當前迭代中到目前為止匹配的所有文本 \\.
- 一個點。 如果使用捕獲/反向引用,則可以不使用\\K
:
regex.sub(r'\G([^\s.]*)\.', r'\1\\.', s)
你可以找到第一個單詞並替換.
在那里,例如:
import re
line = 'DXa0.Xa1.a2.b3.b4 p1 p2 deviceName a=157.585p b=54.46u $x=106.124 $y=107.996 $a=0'
def repl(m):
return m.group().replace(".", "\\.")
print(re.sub(r"^\S+", repl, line.lstrip()))
產量
DXa0\.Xa1\.a2\.b3\.b4 p1 p2 deviceName a=157.585p b=54.46u $x=106.124 $y=107.996 $a=0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.