用正则表达式分隔单词和数字

时间:2020-04-03 10:06:01

标签: python regex

我很难将给定的字符串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]

4 个答案:

答案 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
相关问题