繁体   English   中英

Python sed正则表达式匹配

[英]Python sed regex matching

我试图在我的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命令?

编辑:

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

sed s/-[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) (因为没有g sed命令中的修饰符,将1传递给re.sub以仅替换一个(首先出现)。

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

您可以在Python re文档中了解有关Python regex语法的更多信息。

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

实际上,您的代码是用'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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM