匹配一系列连字符后的所有内容

时间:2013-08-24 00:57:10

标签: python regex

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

示例:

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结合使用来捕获文本。

如果有人可以帮我解决这个正则表达式问题,我会很感激。

3 个答案:

答案 0 :(得分: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之类的连字符范围外)被解释为单个字符。它们不是模式。因此[---][-]没有区别。事实上,[---]是从--的字符范围,包括在内。

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

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

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

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