Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.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

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

Python-正则表达式-多行文本之间的过滤器

Python-正则表达式-多行文本之间的过滤器,python,regex,Python,Regex,我正在尝试从以下行分隔的文本文件中筛选“abc”、“def\nghj”、“klm” ******** abc ******** def ghj ******** klm 我试图将'\*'字符转义,并将其余字符分组(使用类似'.*.*(.*.*.*.')的表达式),但没有成功 感谢您提供的任何帮助。可以在多行模式下使用以下内容 其中,[*]{4}表示分隔符 # (?:^(?![*]{4}).*(?:\r?\n|$))+ (?: ^ (?! [*]{4} )

我正在尝试从以下行分隔的文本文件中筛选“abc”、“def\nghj”、“klm”

********
abc
********
def
ghj
********
klm
我试图将
'\*'
字符转义,并将其余字符分组(使用类似
'.*.*(.*.*.*.'
)的表达式),但没有成功


感谢您提供的任何帮助。

可以在多行模式下使用以下内容
其中,
[*]{4}
表示分隔符

 # (?:^(?![*]{4}).*(?:\r?\n|$))+

 (?:
      ^ 
      (?! [*]{4} )
      .* 
      (?: \r? \n | $ )
 )+
输出:

 **  Grp 0 -  ( pos 10 , len 5 ) 
abc
--------------------

 **  Grp 0 -  ( pos 25 , len 10 ) 
def
ghj
---------------------

 **  Grp 0 -  ( pos 45 , len 3 ) 
klm  

如果要查找不包含星号符号的文本块,可以使用
re.findall
和多行模式:

text = '''********
abc
********
def
ghj
********
klm
'''
re.findall(r'^[^*]+$', text, re.M)
或者,如果要查找按星号行分割的文本块,则应使用
re.split

re.split(r'(?:^|\n)\*+(?:\n|$)', text, re.M)

为什么不迭代文件并每隔一行抓取一行呢?我知道我可以这样做,但我想学习如何使用regex(除非有人告诉我它不值得:))它不值得,但是
re.split(\*+”,s)
会做你想做的事!不值得这么做的原因,是因为它只需要遍历所有行,但在行内执行任何过滤吗?@PadraicCunninghamregex可能会很慢,如果你一次读取一个大文件,希望将其与正则表达式匹配,那么,你的系统会开始抱怨你。当然,如果该文件相当小,它也可以正常工作,但我们不知道您使用的是哪种文件。另一种选择是逐行读取文件,这将使其更易于处理,但是,您将无法使用regex。。。因此,当你遇到
*
s时,逐行阅读并切换“模式”。