【问题标题】:sed regex to Python resed 正则表达式到 Python re
【发布时间】:2012-05-08 12:24:51
【问题描述】:

谁能帮我把这个正则表达式翻译成 Python re 模块?

sed -e "s/^[^ ]* \([^ ]*\) \([0-9]*\) \([0-9:]*\) \([0-9]*\) /\1 \2 \4 \3 /"

据我了解,这会将一个文本替换为另一个文本。如何使用re 模块创建类似的东西?谢谢!

例如Fri Mar 21 07:16:51 2008 -0600 将转换为 Mar 21 2008 07:16:51 -0600

source = 'Fri Mar 21 07:16:51 2008 -0600'
pattern = re.compile('^[^ ]* \([^ ]*\) \([0-9]*\) \([0-9:]*\) \([0-9]*\) ')
result = re.sub('\\1 \\2 \\4 \\3 ', source)

【问题讨论】:

  • @nightcracker:我知道我必须使用re.sub,但我无法想象\1 \2 \4 \3是什么意思。
  • \1 \2 \4 \3 可以使用\\1 \\2 \\4 \\3 匹配,除此之外,您的正则表达式应该直接转换为 Python 的 re 模块。
  • 您能否在问题中包含一些示例输入?
  • 我添加了示例输入和我的尝试(感谢@covertCoder)。但是还是不行。
  • 那应该也是result = pattern.sub(...)

标签: python regex sed


【解决方案1】:

在你的模式中也去掉括号上的反斜杠,如下所示:

pattern = re.compile('^[^ ]* ([^ ]*) ([0-9]*) ([0-9:]*) ([0-9]*) ')

按照您的方式,您正在逃避需要被识别为分组的括号,以便您实际捕获与 \1 ... \4 对应的四个组

【讨论】:

  • 是的,行得通!但为什么?我只需要在sed中筛选这些符号?
  • 我不知道为什么它在sed 中有效,但在python 中,只有当你想匹配特殊字符时才会转义它们,而不是将它们用作正则表达式特殊字符:P。这是你可能得到的最干净的答案,这就是我删除我的原因。
  • sed 命令中的反斜杠正在为命令处理器 (bash/sh/whatever) 转义它。
【解决方案2】:

试试这个,单行版本:

import re
re.sub(r'^[^ ]* ([^ ]*) ([0-9]*) ([0-9:]*) ([0-9]*) ', '\g<1> \g<2> \g<3> \g<4>', source)

或者这样,使用编译模式 - 如果要重用相同的正则表达式,效率会更高:

import re
pattern = re.compile(r'^[^ ]* ([^ ]*) ([0-9]*) ([0-9:]*) ([0-9]*) ')
pattern.sub('\g<1> \g<2> \g<3> \g<4>', source)

【讨论】:

  • 据我了解,使用'\g&lt;1&gt;''\1' 没有区别?
  • \g&lt;1&gt; 更通用一点,根据documentation,您可以使用此语法来引用组,不仅可以按编号,还可以按名称。它对于避免某些歧义很有用。就个人而言,我更喜欢这种形式。
  • 另外,请注意最好将正则表达式括在r''(原始字符串)中,这样您就无需转义“\”等特殊字符
猜你喜欢
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 2014-09-10
  • 2018-12-30
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多