Python-每次在字符串中找到模式时如何添加新行?

时间:2018-11-23 10:33:10

标签: regex python-3.x replace

每次在字符串中找到正则表达式列表的模式时,如何添加新行?

我正在使用python 3.6。

我得到以下输入:

12.13.14应该在这里开始新的一行。

12.13.15应该在这里开始新的一行。

这是一些文字。它用一行编写。 12.13。这是更多文本。 2.12.14。这里还有更多文字。

我希望获得以下输出:

12.13.14

应该在这里开始新的一行。

12.13.15

应该在这里开始新的一行。

这是一些文字。它用一行编写。

12.13。

这里还有更多文字。

2.12.14。

这里还有更多文字。

我的第一次尝试返回的结果与输入相同:

Curl

第二次尝试返回错误'TypeError:+不支持的操作数类型:'_sre.SRE_Pattern'和'str'

in_file2 = 'work1-T1.txt'
out_file2 = 'work2-T1.txt'


start_rx = re.compile('|'.join(
    ['\d\d\.\d\d\.', '\d\.\d\d\.\d\d','\d\d\.\d\d\.\d\d']))


with open(in_file2,'r', encoding='utf-8') as fin2, open(out_file2, 'w', encoding='utf-8') as fout2:
    text_list = fin2.read().split()
    fin2.seek(0)

    for string in fin2:
        if re.match(start_rx, string):
            string = str.replace(start_rx, '\n\n' + start_rx + '\n')

        fout2.write(string)

2 个答案:

答案 0 :(得分:1)

尝试一下

out_file2=re.sub(r'(\d+) ', r'\1\n', in_file2)
out_file2=re.sub(r'(\w+)\.', r'\1\.\n', in_file2)

答案 1 :(得分:1)

首先,要搜索并用正则表达式替换,您需要使用re.sub,而不是str.replace

第二,如果您使用re.sub,则不能在替换模式中使用正则表达式模式,需要对要保留的正则表达式部分进行分组,并在替换中使用反向引用(或者,如果您只想引用整个匹配项,请使用\g<0>反向引用,不需要捕获组。

第三,当您建立一个非锚定的交替模式时,请确保首先使用更长的替代方案,即start_rx = re.compile('|'.join(['\d\d\.\d\d\.\d\d', '\d\.\d\d\.\d\d', '\d\d\.\d\d\.']))。但是,您可以在此处手动使用更精确的模式。

这是固定代码的方式:

with open(in_file2,'r', encoding='utf-8') as fin2, open(out_file2, 'w', encoding='utf-8') as fout2:
    text = fin2.read()
    fout2.write(re.sub(r'\s*(\d+(?:\.\d+)+\.?)\s*', r'\n\n\1\n', text))

请参见Python demo

模式是

\s*(\d+(?:\.\d+)+\.?)\s*

请参见regex demo

详细信息

  • \s*-超过0个空格
  • (\d+(?:\.\d+)+\.?)-组1(替换模式中为\1):
    • \d+-1个以上数字
    • (?:\.\d+)+-1个或多个.和1个以上的数字重复
    • \.?-可选的.
  • \s*-超过0个空格