正则表达式从字符串python中提取三个字符

时间:2016-01-26 00:57:39

标签: python regex

我有一个字符串testing_7_3_4_testing

我想将testing_7_3_4_testing替换为testing_7.3.4_testing,我尝试使用str.replace(/\d_\d/, ".")并获得一些非常奇怪的结果。正则表达专家请帮忙!

2 个答案:

答案 0 :(得分:4)

试试这个:

import re

my_strs = [
    'testing_7_3_4_testing',
    'testing_7_3_testing',
    'testing_7_3_4_5',
    'testing_71_312_4123_testing',
]

pattern = r"""
    (\d+)      #Match a digit, one or more times, captured in group 1, followed by...
    _          #an underscore, followed by...
    (?=\d+)    #a digit, one or more times, but do not include as part of the match
"""

for my_str in my_strs:
    new_str = re.sub(pattern, r'\1.', my_str, flags=re.X)
    print(new_str)

--output:--
testing_7.3.4_testing
testing_7.3_testing
testing_7.3.4.5
testing_71.312.4123_testing

模式(?=\d+)表示匹配一个数字,一次或多次,但实际上不包括匹配数字作为匹配的一部分。

答案 1 :(得分:2)

将每个数字保存到自己的saving group中,引用替换字符串中的组:

>>> import re
>>> s = "testing_7_3_4_testing"
>>> re.sub(r"(\d)_(\d)_(\d)", r"\1.\2.\3", s)
'testing_7.3.4_testing'

或者,我们可以使用替换函数,与第一种方法相反,它还处理输入字符串中可变数量的数字:

>>> def replacement(m):
...     x, y, z = m.groups()
...     return x + y.replace("_", ".") + z
... 
>>> re.sub(r"(.*?_)([0-9_]+)(_.*?)", replacement, s)
'testing_7.3.4_testing'

非正则表达式方法将涉及按_拆分,切片和加入:

>>> l = s.split("_")
>>> l[0] + "_" + ".".join(l[1:-1]) + "_" + l[-1]
'testing_7.3.4_testing'