Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.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 如果包含换行符,正则表达式将失败_Python - Fatal编程技术网

Python 如果包含换行符,正则表达式将失败

Python 如果包含换行符,正则表达式将失败,python,Python,我试图从以#字符分隔的字符串中提取一个简单的句子 str = "#text text text \n text#" 用这个图案 pattern = '#(.+)#' 现在,有趣的是,当字符串包含换行符时,正则表达式不匹配 out = re.findall(pattern, str) # out contains empty [] 但是,如果我从字符串中删除\n,它可以正常工作。知道如何解决这个问题吗?将该标志添加到编译或匹配中。将该标志添加到编译或匹配中。还传递该标志,使真正匹配所有内容

我试图从以#字符分隔的字符串中提取一个简单的句子

str = "#text text text \n text#"
用这个图案

pattern = '#(.+)#'
现在,有趣的是,当字符串包含换行符时,正则表达式不匹配

out = re.findall(pattern, str) # out contains empty []
但是,如果我从字符串中删除\n,它可以正常工作。知道如何解决这个问题吗?

将该标志添加到编译或匹配中。

将该标志添加到编译或匹配中。

还传递该标志,使
真正匹配所有内容

使“.”特殊字符完全匹配任何字符,包括换行符;如果没有此标志,“.”将匹配除换行以外的任何内容

同时传递标志,使
与所有内容真正匹配

使“.”特殊字符完全匹配任何字符,包括换行符;如果没有此标志,“.”将匹配除换行以外的任何内容


如果希望您的
换行符匹配,请使用
re.DOTALL
,同时:-

>>> out = re.findall('#(.+)#', my_str, re.DOTALL)
>>> out
['text text text \n text']

另外,使用内置名称作为变量名也不是一个好主意。使用
my_str
而不是
str

如果希望
与新行匹配,请使用
re.DOTALL
:-

>>> out = re.findall('#(.+)#', my_str, re.DOTALL)
>>> out
['text text text \n text']
另外,使用内置名称作为变量名也不是一个好主意。使用
my_str
而不是
str

试试这个regex
“#([^#]+)#”

它将匹配分隔符之间的所有内容。

试试这个正则表达式
“#”([^#]+)#”


它将匹配分隔符之间的所有内容。

这不具有相同的语义。这将在第一个
#
处停止匹配,而不是最后一个
#
,这可能是OP的意图。所以+1。这不具有相同的语义。这将在第一个
#
处停止匹配,而不是最后一个
#
,这可能是OP的意图。注意:正则表达式是贪婪的。类似于
“#text text text\n text###”
的字符串将与包含的第二个
#
匹配。使用Dima的解决方案来避免这种情况,或者使用非贪婪变量:
'#(.+?)#'
re.DOTALL
@Evert;)@我不明白你的意思。这个答案仍然有贪婪的警告。@Evert怎么会这样?它不能匹配两个定界
之间的任何
s,这基本上使它不贪婪。你知道,我很高兴我还没有使用字符串匹配。正则表达式在我看来就像黑魔法。小心:正则表达式是贪婪的。类似于
“#text text text\n text###”
的字符串将与包含的第二个
#
匹配。使用Dima的解决方案来避免这种情况,或者使用非贪婪变量:
'#(.+?)#'
re.DOTALL
@Evert;)@我不明白你的意思。这个答案仍然有贪婪的警告。@Evert怎么会这样?它不能匹配两个定界
之间的任何
s,这基本上使它不贪婪。你知道,我很高兴我还没有使用字符串匹配。正则表达式在我看来像是黑魔法。