如果文本块具有非统一列表,例如,如下所示:
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
或者还有比正则表达式更好的方法吗?
答案 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'