【问题标题】:Python sed regex matchingPython sed 正则表达式匹配
【发布时间】:2018-12-30 16:00:38
【问题描述】:

我试图在我的 Python 脚本中使用 re.sub() 来删除一些字符串。

我使用的sed 命令是(在 Linux 上):

echo "helloworld-5b5cf484-g582f" | sed 's/-[a-z0-9]\{5\}$//' | sed 's/-[0-9]\{10\}$//' | sed 's/-[a-z0-9]\{8,10\}$//'

这将输出helloworld

现在,使用 Python,我尝试为第一个 sed 组执行此操作:

newstring = re.sub(r'(s/-[a-z0-9]\{5\}$//)', r'\1', 'helloworld-5b5cf484-g582f')

但它只输出副本,即helloworld-5b5cf484-g582f

我怎样才能执行这样的sed 命令?

编辑:

我的问题不在于我的正则表达式。输入字符串比我作为示例提供的更复杂。问题是关于如何正确使用 re.sub() 和我使用的正则表达式:)

【问题讨论】:

  • 您是否要删除最后两个连字符分隔的块?试试re.sub(r'(?:-[^-]*){2}$', '', s)。 sed s/-[a-z0-9]\{5\}$// 命令被翻译为re.sub(r'-[a-z0-9]{5}$', '', s)
  • 为什么不在第一个- 之前搜索所有内容?否则请说明拆分的时间和地点。
  • 取出s///,它们不是正则表达式的一部分。
  • 我的问题不在于我的正则表达式。输入字符串比我作为示例提供的更复杂。问题是关于如何正确使用re.sub() 和我使用的正则表达式:)
  • @TomZych 仍然给我一份我输入的副本:newstring = re.sub('-[a-z0-9]\{5\}$', '', 'helloworld-5b5cf484-g582f')

标签: python regex python-3.x sed


【解决方案1】:

seds/-[a-z0-9]\{5\}$// 命令被翻译为re.sub(r'-[a-z0-9]{5}$', '', s)

注意:

  • BRE POSIX 区间量词没有转义,\{5\} => {5}
  • s/<pattern>/<repl>/ 表示<pattern> 替换为<repl>,等于re.sub('<pattern>', '<repl>', s, 1)(因为sed 命令中没有g 修饰符,1 被传递给re.sub只替换一个,第一个,出现)。

修饰符在re.sub 中作为选项或标志 传递,例如re.sub(r'-[a-z0-9]{5}$', '', s, flags=re.I)re.I 是不区分大小写的修饰符)。请注意,无需使用g 修饰符,因为re.sub 默认替换所有出现。

您可以在Python re documentation 中了解有关 Python 正则表达式语法的更多信息。

【讨论】:

  • 仅供参考,您可以在翻译s/-[a-z0-9]\{5\}$// 命令时省略1 count 参数到re.sub,因为$ 只会使正则表达式在字符串末尾匹配一次。如果您打算实际替换第一次出现,请始终将1 作为计数(第三个)参数传递给re.sub
【解决方案2】:

您的正则表达式与您要执行的操作不匹配。

实际上,您的代码正在用 'helloworld-5b5cf484-g582f'(或类似的东西)中的第一个匹配项替换以连字符开头的 5 个字符长的字母数字字符字符串。

这种情况不会发生,因为您的字符串不是以连字符开头的。

如果我是正确的,您想用一个空字符串替换以连字符开头的任何 5 个字符或 8 个字符长的小写字母数字字符串。

这可以通过以下代码实现:

代码
newstring = re.sub("(-[a-z0-9]{8})?(-[a-z0-9]{5})?", '', 'helloworld-5b5cf484-g582f')
结果
print newstring
helloworld

这里是重新模块文档的指针:

  1. python2:https://docs.python.org/2/library/re.html
  2. python3:https://docs.python.org/3/library/re.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 2013-09-22
    • 2022-12-11
    • 2014-09-03
    相关资源
    最近更新 更多