re.sub用列表中的最后一项替换所有内容

时间:2015-08-14 13:43:37

标签: python regex

每当我找到一个以大写字母开头的单词时,我试图创建一个新行,这是我的代码:

import re


def new_line(name):
    fr = open(name, 'r')
    string = fr.read()
    new_list = []
    fw = open('output', 'w')
    c = 0
    m = re.findall('\s+[A-Z]\w+', string,re.MULTILINE)
    for i in m:

        j = str(i)
        l = re.sub('[A-Z]\w+','\n'+str(m[c]), string,re.MULTILINE)
        c = c+1
        print("These are the list items:"+j+"\n")



     print("STRINGY STRING BELOW!!!")
     print(string)
     print('/////////////////////////////////////////////')
     print("Output :\n"+l)
     print(m)
new_line('task.txt')

所需的输出应该是这样的:

这些是列表项:Miss

这些是列表项:Catherine

。 。

这些是列表项目:Heathcliff

然后添加新行的文本,而不是用\ n替换每个匹配和匹配本身,文本将仅替换为列表中的最后一项m

像这样:

输出:

我得到了

希刺克厉夫

希刺克厉夫和我自己

希刺克厉夫

希刺克厉夫而且,令我愉快的失望,她的表现比我敢于期待的要好得多。

希刺克厉夫似乎非常喜欢

希刺克厉夫。

希刺克厉夫甚至对他的妹妹,她表现出了很多的感情。

我没有发布原始输入文本,因为它太长了。

4 个答案:

答案 0 :(得分:2)

你可以试试这个。它只是在每个单词(带大写字母)前加\n

>>> re.sub(r'\s+([A-Z])','\n\g<1>', "Heathcliff and myself to Heathcliff; to my")
'Heathcliff and myself to\nHeathcliff; to my'

答案 1 :(得分:1)

由于列表仅包含将在列表m中结束的匹配,因此您不断用m [c]中的内容替换文档中以大写字母开头的任何单词,因此在您循环之后,它将是列表中的姓氏。

尝试在c = 1,c = 2等之后停止循环,你会在列表中找到所有名称。

答案 2 :(得分:1)

re.sub()替换模式的所有非重叠事件。

这是什么意思?请参阅以下示例:

  import re
  test_str = 'spam spam spam'
  print re.sub('spam', 'beans', test_str, re.MULTILINE)

将打印

  

豆豆豆

这意味着您的代码正在用您的最后一个单词替换字符串中大写单词的所有出现次数。这就是为什么你要看到Heathcliff&#39;无处不在:这是你文本中最后一个大写的单词

答案 3 :(得分:1)

以下是我的方法:使用re.sub搜索空格后跟大写字母。用大写字母本身代替。

with open(name) as infile, open('output', 'w') as outfile:
    contents = infile.read()
    new_contents = re.sub(r'\s+([A-Z])', r'\n\1', contents)
    outfile.write(new_contents)

注释

  • 模式中的paretheses告诉re记住
  • 中的文本
  • 替换文字中的\1是<{li>之前记住的re