是否有使用正则表达式反转子字符串的简单方法?

时间:2019-02-22 10:07:31

标签: python regex python-3.x substring

我正在处理一些包含数字和字符的字符串。输入字符串例如elementX5elementX50等。我知道怎么 用以下代码更改它们elements_10elements_100等:

import re

inp = ["elementX5asdl", "elementX50al;smd;l", "elementX500laknsd", "elementX5000aknsd"]
for el in inp:
    tmp_usr_str = re.search("elementX50*", el).group()
    tmp_usr_str = re.sub(r"elementX", "elements_", tmp_usr_str)
    tmp_usr_str = re.sub(r"\d+", lambda x: str(2*int(x.group())), tmp_usr_str)
    print(tmp_usr_str)

我想更进一步,将包含数字的子字符串与包含字母的子字符串求反,以获得诸如10_elements100_elements等内容。

我知道我可以分割字符串,然后再次进行组合,但是使用正则表达式是否有更优雅的方式,可能将命令嵌入到现有的一行中?

2 个答案:

答案 0 :(得分:1)

使用捕获组:

import re

inp = ["elementX5asdl", "elementX50al;smd;l", "elementX500laknsd", "elementX5000aknsd"]
for el in inp:
    tmp_usr = re.search("elementX50*", el)
    if tmp_usr:
        tmp_usr_str = tmp_usr.group()
        tmp_usr_str = re.sub(r"(element)X(\d+)", lambda x: "{}_{}s".format(str(2*int(x.group(2))), x.group(1)), tmp_usr_str)
        print(tmp_usr_str)

请参见Python demo。输出:

10_elements
100_elements
1000_elements
10000_elements

详细信息

  • tmp_usr = re.search("elementX50*", el)-提取所需的子字符串
  • re.sub(r"(element)X(\d+)", lambda x: "{}_{}s".format(str(2*int(x.group(2))), x.group(1)), tmp_usr_str)-将element匹配并捕获到组1中,而\d+捕获到组2中X之后的一个或多个数字,并在lambda表达式内交换该组值将它们与_连接起来,并在末尾附加s

答案 1 :(得分:0)

这是最容易编写的正则表达式。

(.*)_(.*)

这将捕获_\1之前的所有内容以及_\2之后的所有内容。

您要做的就是在替换的同时替换两组:

\2_\1

Demo