替换所有匹配第一个单词的正则表达式的匹配项

时间:2018-10-24 19:14:51

标签: python regex python-3.x

我想解析一个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]

它可以产生预期的结果,但效果并不理想,我相信有更好的方法。

3 个答案:

答案 0 :(得分:2)

必须坚持使用ExpressionAttributeValues: { ":start_date": new Date(event.start_date).toISOString(), ":end_date": new Date(event.end_date).toISOString() }, 吗?

没有那么简单:

re

答案 1 :(得分:2)

您可以使用re使用正则表达式将非空白字符的第一个连字符和lambda表达式作为替换参数之后的第一个单词匹配到第一个空白:

re.sub(r"^\s*\S+", lambda x: x.group().replace('.', r'\.'), s)

在这里,^\s*\S+匹配任何0+空格,然后在字符串的开头匹配1+非空格,然后将该匹配项(.)中的所有x.group()替换为\.个字符序列。

请参见Python demo

如果安装了PyPi regex module,则只需一个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 demo。另外,请参见this regex demo

详细信息

  • \G-字符串的开头或上一次成功匹配的结尾
  • [^\s.]*-除空格(\s)和点(方括号内的点仅匹配.字符)之外的0个或多个字符
  • \K-匹配重置运算符会丢弃当前迭代中到目前为止所有匹配的文本
  • \.-点。

如果使用捕获/反向引用,则可以不用\K

regex.sub(r'\G([^\s.]*)\.', r'\1\\.', s)

答案 2 :(得分:2)

您可以找到第一个单词并替换其中的.,例如:

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