Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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 - Fatal编程技术网

在python中处理\n多行字符串末尾的字符

在python中处理\n多行字符串末尾的字符,python,regex,Python,Regex,我一直在使用python和正则表达式来清理文本文件。我一直在使用以下方法,并且基本上是有效的: mystring = compiledRegex.sub("replacement",mystring) 所讨论的字符串是一个完整的文本文件,其中包含许多嵌入的换行符。一些已编译的正则表达式使用re.DOTALL选项覆盖多行。如果编译的正则表达式中的最后一个字符是\n,则上述命令将替换正则表达式的所有匹配项,但以字符串末尾的最后一个换行符结尾的匹配项除外。事实上,我还遇到了其他一些与新行和多个新行(

我一直在使用python和正则表达式来清理文本文件。我一直在使用以下方法,并且基本上是有效的:

mystring = compiledRegex.sub("replacement",mystring)

所讨论的字符串是一个完整的文本文件,其中包含许多嵌入的换行符。一些已编译的正则表达式使用
re.DOTALL
选项覆盖多行。如果编译的正则表达式中的最后一个字符是\n,则上述命令将替换正则表达式的所有匹配项,但以字符串末尾的最后一个换行符结尾的匹配项除外。事实上,我还遇到了其他一些与新行和多个新行(当它们出现在字符串末尾时)毫无疑问相关的问题。有人能告诉我这里发生了什么事吗?提前谢谢。

我无法从您的解释中很好地理解发生了什么,但是您可以通过在文件中读取时用一个换行符替换所有多个换行符来修复它。另一种选择可能是修剪()正则表达式,删除结尾处的\n,除非您需要它。若我正确理解了您的意思,您所需要的只是在每行末尾获得一个不带换行符的文本,然后在该文本上迭代以找到所需的单词,您可以尝试使用以下方法:

data = (line for line in text.split('\n') if line.strip())# gives you all non empty lines without '\n'at the end
现在,您可以使用列表切片或正则表达式功能搜索/替换所需的任何文本

或者,您可以随时使用“替换”将所有“\n”替换为:

text.replace('\n', '')

我打赌你的文件不会以换行符结尾

>>> content = open('foo').read()
>>> print content
TOTAL:.?C2
abcTOTAL:AC2
defTOTAL:C2
>>> content
'TOTAL:.?C2\nabcTOTAL:AC2\ndefTOTAL:C2'
…因此最后一行与正则表达式不匹配:

>>> regex = re.compile('TOTAL:.*?C2\n', re.DOTALL)
>>> regex.sub("XXX", content)
'XXXabcXXXdefTOTAL:C2'
如果是这种情况,解决方案很简单:只需匹配换行符或文件结尾(使用
$
):


问号是不是用来防止正则表达式一次匹配多条直线?如果是这样,那么您可能希望使用多行标志而不是DOTALL标志。^符号现在将在新行或字符串开头之后匹配,$符号现在将在新行字符或字符串结尾之前匹配。 例如

然而,这仍然存在空行的问题。但是为什么不在末尾运行一个额外的正则表达式来删除空行呢

regex = re.compile('\n{2,}')
content = regex.sub('\n', content)

你能为这个问题提供一个(最小的)测试用例吗?好的。其中一个编译表达式是:“TOTAL:.*C2\n”此表达式将在文件中匹配多次。如果我省略了\n,它将删除所有导致空行的换行符,但不保留换行符。如果包含,则不会留下空行,但不会删除最后一个匹配项。一个更明显的示例可能是,如果创建一个与“\n\n”匹配的已编译正则表达式,以便可以将其分为“”(从而删除空行),则除“\n\n”之外的所有“\n\n”上的替换都会成功它出现在字符串的最末尾。似乎是因为正则表达式在默认情况下与文件的行相匹配(并且行由\n字符定义),而这是一个带有嵌入换行符的长字符串,python对待最后的换行符不同于嵌入的换行符?你确定文件以换行符结尾吗?看看brandizzi的答案,如果这是问题的话。是的,再看一眼,brandizzi的答案确实解决了这个问题(我想)。我不明白$以字符串结尾,而不是最近换行符之前的字符。通常字符串以第一个换行符结尾,这里不是这样。我一直很困惑。谢谢大家的帮助。同样的问题,简单得多:我创建了一个包含几行文本的测试文件。文件中间的一行后面跟着2个换行符。此外,在文件的末尾有两个换行符。我从标准输入中读入该文件,并将其读入一个列表,然后立即将其转换为一个名为“fileAsString”的字符串。已编译的正则表达式是doublenew=re.compile('\n\n')。这个替换是作为FiasStase= DouBeNeW.Sub(‘n’,FielScript字符串)完成的,结果是文件中间的两条新行被替换为单个的,而不是双端的。这很奇怪。我在Python控制台中编写了
string=“This\n\nis\n\n\ntest\n\n”
,然后
regex=re.compile(“\n\n”,re.DOTALL)
,然后
regex.sub(“\n”,string)
结果是
“This\nis\nan\ntest\n”
。您是如何从标准输入读取文件的?您是否使用过sys.stdin.read()?打印(repr(fileAsString))的结果是什么?
regex = re.compile('^TOTAL:.*$', re.MULTILINE)
content = regex.sub('', content)
regex = re.compile('\n{2,}')
content = regex.sub('\n', content)