我正在处理一些包含数字和字符的字符串。输入字符串例如elementX5
,elementX50
等。我知道怎么
用以下代码更改它们elements_10
,elements_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_elements
,100_elements
等内容。
我知道我可以分割字符串,然后再次进行组合,但是使用正则表达式是否有更优雅的方式,可能将命令嵌入到现有的一行中?
答案 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)