查找匹配给定模式的字符串,并使用Python的re模块分隔行

时间:2017-02-17 12:25:22

标签: python regex

在随机字符串中,我需要找到与给定模式匹配的字符串,并将;放在此字符串之后。我想我应该使用re来做,但我并不熟悉它。

示例输入:

this is the first part of string 1/32 part this is the second part of string

因此,我需要将;放在1/32 part之后,例如

this is the first part of string 1/32 part; this is the second part of string

我知道我应该使用re,而且我知道我应该使用re.match的模式看起来像[1-1000]/[1-1000]\spart,但我不知道从哪里开始。

修改:1/32就是一个例子,它可以是65/1231/36/7

2 个答案:

答案 0 :(得分:4)

您只需使用re模块中的re.matchre.sub以及以下正则表达式

import re

my_str = 'this is the first part of string 1/32 part this is the second part of string'
my_regex = r'(\d+/\d+\s+part)'

if re.match(my_regex, my_str):
    print(re.sub(my_regex, r'\1,', my_str))  # this will print: 1/32 part,
    # ...

如果需要多行来匹配相同的正则表达式,那么你需要为正则表达式添加一些额外的标志。请参阅here此类标记的列表。

您可以看到正则表达式here

快速替换(可能有更好的方法)是匹配所需匹配部分之前和之后的部分,并执行以下操作:

import re

my_str = 'this is the first part of string 1/32 part this is the second part of string'
my_regex = r'(.*)(\s+\d+/\d+\s+part)(.*)'

condition = re.match(my_regex, my_str)

if condition:
    part = re.sub(my_regex, r'\2,', my_str)

x = condition.group(1) + part + condition.group(3)
print(x)

将输出修改后的字符串:

  

这是字符串1/32部分的第一部分,这是第二部分   串

具有上述所有功能的简单单行函数将是:

import re


def modify_string(my_str, my_regex):
    return re.sub(my_regex, r'\1,', my_str)

if __name__ == '__main__':
    print(modify_string('first part of string 1/32 part second part of string', r'(\d+/\d+\s+part)'))

但我建议保持这个状况。 以防万一。

答案 1 :(得分:4)

您的用例称为替换。这正是re.sub函数的用途。

import re

s = "bla 1/6 part bla bla 76/88 part 12345/12345 part bla"
print(s)
s = re.sub(r'(\b\d{1,4}/\d{1,4} part)', r'\1;', s)
print(s)

这是

的输出
bla 1/6 part; bla bla 76/88 part; 12345/12345 part bla

请注意;上次出现后遗失的part

我使用{} quantifiers将分数的分子和分母限制为4位小数,这是您用[1-1000]符号提到的。它可以更好地用1?\d{1,3}近似(但这也不完全相同,它也允许例如1999/1999 [1]

[1] ps 作为tripleee commented,十进制数的精确正则表达式从1到1000是[1-9]([0-9][0-9]?)?|1000,它看起来有点复杂,但如果你将只有4位数字1000,并在1到3位数的部分使用多余的括号:[1-9]([0-9]([0-9])?)?。另一种选择是使用\d的字符类快捷方式[0-9],结果为[1-9]\d{0,2}|1000

修改

  • 组合匹配分组。
  • 在分子前添加了锚。