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,这基本上使它不贪婪。你知道,我很高兴我还没有使用字符串匹配。正则表达式在我看来像是黑魔法。