我正在尝试在一行(---
)的三个连字符后捕获文件中的所有剩余文本。
示例:
Anything above this first set of hyphens should not be captured. --- This is content. It should be captured. Any sets of three hyphens beyond this point should be ignored.
应该捕获第一组三个连字符后的所有内容。我得到的最接近的是使用这个有效的正则表达式[^(---)]+$
。它将捕获连字符后的所有内容,但如果用户在该点之后放置任何连字符,则会在用户放置的最后一个连字符后捕获。
我将它与python结合使用来捕获文本。
如果有人可以帮我解决这个正则表达式问题,我会很感激。
答案 0 :(得分:1)
pat = re.compile(r'(?ms)^---(.*)\Z')
(?ms)
添加MULTILINE
和DOTALL
标记。
MULTILINE
标志使^
匹配行的开头(不仅仅是字符串的开头。)我们需要这个,因为---
出现在一行的开头,但是不一定是字符串的开头。
DOTALL
标记使.
匹配任何字符,包括换行符。我们需要这样,以便(.*)
可以匹配多行。
\Z
匹配字符串的结尾(而不是行的结尾)。
例如,
import re
text = '''\
Anything above this first set of hyphens should not be captured.
---
This is content. It should be captured.
Any sets of three hyphens beyond this point should be ignored.
'''
pat = re.compile(r'(?ms)^---(.*)\Z')
print(re.search(pat, text).group(1))
打印
This is content. It should be captured.
Any sets of three hyphens beyond this point should be ignored.
请注意,当您使用括号[...]
定义正则表达式字符类时,括号内的内容(通常,除了a-z
之类的连字符范围外)被解释为单个字符。它们不是模式。因此[---]
与[-]
没有区别。事实上,[---]
是从-
到-
的字符范围,包括在内。
字符类中的括号也被解释为文字括号,而不是分组分隔符。所以[(---)]
相当于[-()]
,包括连字符和左右括号的字符类。
因此,字符类[^(---)]+
匹配连字符或括号以外的任何字符:
In [23]: re.search('[^(---)]+', 'foo - bar').group()
Out[23]: 'foo '
In [24]: re.search('[^(---)]+', 'foo ( bar').group()
Out[24]: 'foo '
你可以看到它的发展方向,以及为什么它不能解决你的问题。
答案 1 :(得分:1)
很抱歉没有直接回答你的问题,但我想知道正则表达式是否使问题过于复杂?你可以这样做:
f = open('myfile', 'r')
for i in f:
if i[:3] == "---":
break
text = f.readlines()
f.close()
或者,我错过了什么?
我倾向于发现正则表达式很难维护,如果你不需要为特定目的提供独特的功能,那么它将更清晰,更易读,以避免完全使用它们。
答案 2 :(得分:1)
s = open(myfile).read().split('\n\n---\n\n', 1)
print s[0] # first part
print s[1] # second part after the dashes
这应该适用于您的示例。要拆分的第二个参数指定拆分字符串的次数。