簡體   English   中英

替換在行的第一個單詞中與正則表達式匹配的所有匹配項

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

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