Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 要从与正则表达式不匹配的项中删除“\n”_Python_Regex_Python 3.x - Fatal编程技术网

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

Python 要从与正则表达式不匹配的项中删除“\n”,python,regex,python-3.x,Python,Regex,Python 3.x,例如,如果有一个非统一列表的文本块,该列表如下所示: 1234:5678 words.words 1234:567 words 1234:5678 wordswords targetMe 1234:678 words targetMe 1234:5678 words.words 1234:567 words 1234:5678 wordsword,targetMe 1234:678 words,targetMe 我有一个正则表达式,它看起来像下面这样,我可以对匹配它的项进行操作,也就是说,除

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

1234:5678 words.words
1234:567 words
1234:5678 wordswords
targetMe
1234:678 words
targetMe
1234:5678 words.words
1234:567 words
1234:5678 wordsword,targetMe
1234:678 words,targetMe
我有一个正则表达式,它看起来像下面这样,我可以对匹配它的项进行操作,也就是说,除了以数字开头的行以外的所有内容:

fooRegex = re.compile(r'(\d{4}:\d+\s.*')
如何针对与正则表达式不匹配的行删除\n?最后,我想要的是如下所示:

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

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

正则表达式在这里似乎很好,但是您的正则表达式无效,您在开始时有一个额外的正则表达式

我相信这正是你想要的:

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:][/p>切掉第一个'\n',你甚至不需要正则表达式,但是如果你想用正则表达式来做这件事-使用负lookaheads来选择要删除的新行,并用逗号替换它们:

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

是的,我误解了这个问题。更新已应用,但我更喜欢另一个人的答案。你认为在这种情况下重新编译真的会有所不同吗?谢谢你的帮助!出于学习的目的,因为这对我来说还是新鲜事:这个?!在正则表达式的开头,使其查找与正则表达式不匹配的元素?最后的.sub怎么了?@delerious莴苣-在这个特殊的例子中,没有。我甚至没有预先编译正则表达式就回答了最初的问题,但我想遵循OP的风格,这可能会让他更容易理解。依赖于Python版本和模式的复杂性,即它是否依赖于外部,编译通常不是必需的,也不是有益的,但当重用模式时,编译模式并没有坏处,因为它有助于可读性和可维护性。可以帮助解释正则表达式的作用@zwer我倾向于同意您关于编译正则表达式的可读性和可维护性的看法,我只是想把它留在那个里,以防OP不知道。谢谢你的回复@马尔蒙福特-?!。。。表示a-本质上意味着如果该模式不遵循它,则选择前面的模式-在本例中,仅当新行后面没有四位数字、一列和一个或多个数字时,才选择新行。至于re.sub,它代表正则表达式替换——在字符串数据中用逗号替换匹配的模式。