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