1

我试图在行首(---)的三个连字符后捕获文件中的所有剩余文本。

例子:

不应捕获第一组连字符之上的任何内容。

---

这是内容。它应该被捕获。
超出此点的任何三个连字符的集合都应被忽略。

应该捕获第一组三个连字符之后的所有内容。我得到的最接近的是使用这个[^(---)]+$稍微有效的正则表达式。它将捕获连字符之后的所有内容,但如果用户在该点之后放置任何连字符,则它会在用户放置的最后一个连字符之后捕获。

我将它与 python 结合使用来捕获文本。

如果有人可以帮助我解决这个正则表达式问题,我将不胜感激。

4

3 回答 3

1
pat = re.compile(r'(?ms)^---(.*)\Z')

(?ms)添加MULTILINEDOTALL标志。

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)解释为单个字符。它们不是模式。所以[---]与 没有什么不同[-]。实际上,[---]是字符的范围从--,包括在内。

字符类中的括号也被解释为文字括号,而不是分组分隔符。so[(---)]等价于[-()],包括连字符和左右括号的字符类。

因此,字符类[^(---)]+匹配除连字符或括号之外的任何字符:

In [23]: re.search('[^(---)]+', 'foo - bar').group()
Out[23]: 'foo '

In [24]: re.search('[^(---)]+', 'foo ( bar').group()
Out[24]: 'foo '

您可以看到这是怎么回事,以及为什么它对您的问题不起作用。

于 2013-08-24T01:05:51.007 回答
1

很抱歉没有直接回答您的问题,但我想知道正则表达式是否使问题过于复杂?你可以这样做:

f = open('myfile', 'r')

for i in f:
    if i[:3] == "---":
        break

text = f.readlines()

f.close()

或者,我错过了什么?

我倾向于发现正则表达式很难维持,如果您不需要它们的独特功能来实现特定目的,那么完全避免使用它们会更干净、更易读。

于 2013-08-24T01:06:52.970 回答
1
s = open(myfile).read().split('\n\n---\n\n', 1)
print s[0] # first part
print s[1] # second part after the dashes

这应该适用于您的示例。split 的第二个参数指定拆分字符串的次数。

于 2013-08-24T01:51:54.310 回答