我很难将给定的字符串foobar123
分隔在单词和带下划线的未知长度数字之间(结果:foobar_123
)。我尝试使用正则表达式找到匹配项r1(有效)。但是之后,我不知道如何分隔对应的匹配项。
import re
x = "foobar123"
y = re.sub("[a-z]{1}\d{1}", "\1", x)
print(y) # Output: "fooba23"
我认为应该使用“ \ 1”来访问之前的比赛。因此,我尝试用自己替换找到的匹配项,但这将导致:fooba23。不应该是foobar123。
谢谢。
更新:
很抱歉上面的代码中的错字,应该是[a-z]
而不是[0-9]
。
答案 0 :(得分:6)
这可以用数字捕获组来达到目的吗?
import re
x = "foobar123"
y = re.sub(r'(\d+)', r'_\1', x)
print(y)
我使用原始字符串转义了反斜杠。您忘了做的事=)
没有捕获组的有趣替代方法是使用re.sub
的{{3}}参数:
import re
x = "foobar123"
y = re.sub(r'(?=\d)', '_', x, 1)
print(y)
模式(?=\d)
返回所有位置,后跟一个数字,但只有第一个(因此count
的1被下划线代替)。
答案 1 :(得分:2)
您可以捕获最后一个字母,后跟一个数字并添加下划线:
re.sub(r'([a-z])(?=\d)', r'\1_', x)
# 'foobar_123'
答案 2 :(得分:2)
您使用[0-9]{1}\d{1}
匹配2位数字,其中不需要{1}
,并且不考虑数字前的字符a-z。
您可以在没有捕获组的情况下使用仅匹配\g<0>
后加下划线进行替换。
该模式将匹配一个字符[a-z]
,并使用正向超前(?=\d)
来断言右边的数字。
import re
x = "foobar123"
y = re.sub("[a-z](?=\d)", "\g<0>_", x)
print(y) # Output: "foobar_123"
答案 3 :(得分:1)
您可以
([a-z]+)([0-9]+)
\1_\2
我为忽略大小写添加了re.I
x = "Foobar123"
y = re.sub("([a-z]+)([0-9]+)", r"\1_\2", x, flags=re.I)
print(y) # Foobar_123