想要从与正则表达式不匹配的项目中删除“\ n”

时间:2017-06-14 01:08:58

标签: python regex python-3.x

如果文本块具有非统一列表,例如,如下所示:

1234:5678 words.words
1234:567 words
1234:5678 wordswords
targetMe
1234:678 words
targetMe

我有一个类似于以下内容的正则表达式,我可以对与之匹配的项目进行操作(即,除了以数字开头的行之外的所有内容):

fooRegex = re.compile(r'(\d{4}:\d+\s.*')

如何定位与正则表达式不匹配的行以删除\ n?最后,我想要的东西如下所示:

1234:5678 words.words
1234:567 words
1234:5678 wordsword,targetMe
1234:678 words,targetMe

或者还有比正则表达式更好的方法吗?

2 个答案:

答案 0 :(得分:1)

你甚至不需要正则表达式,但是如果你想用正则表达式做 - 请使用否定前瞻来选择要删除的新行并用逗号替换它们:

import re

data = """1234:5678 words.words
1234:567 words
1234:5678 wordswords
targetMe
1234:678 words
targetMe"""

DATA_FIXER = re.compile(r"\n(?!\d{4}:\d+)")  # you want it compiled for reuse?

data_fix = DATA_FIXER.sub(",", data)
# 1234:5678 words.words
# 1234:567 words
# 1234:5678 wordswords,targetMe
# 1234:678 words,targetMe

答案 1 :(得分:0)

正则表达式在这里似乎很好,但是你的正则表达式无效,你有一个额外的(在开头。

我相信这可以满足您的需求:

import re

input = """1234:5678 words.words
1234:567 words
1234:5678 wordswords
targetMe
1234:678 words
targetMe"""

fooRegex = re.compile(r'\d{4}:\d+\s.*')

output = ''.join([ '\n' + line if fooRegex.search(line) is not None else ',' + line for line in input.split('\n') ])[1:]

print(output)

它将行拆分为一个列表,然后根据正则表达式的结果,使用'\ n'或','创建一个新列表,这些元素将添加到列表中。然后它将列表的元素连接成一个字符串,然后我们用[1:]

切掉第一个'\ n'