0

次のファイルがあります。

this is the first line
and this is the second line
now it is the third line
wow, the fourth line
but now it's the fifth line
etc...
etc...
etc...

「今は3行目です」から「しかし今は5行目です」まで、これらの3行を(それらの行の行番号を知らずに)ど​​のようにコピーしますか?perl では、次のようにします。

/^now it is/../^but now/

Pythonで同等のものは何ですか?

私は持っています(明らかに1行しか取得しません):

regex = re.compile("now it is")
for line in content:
    if regex.match(line):
        print line

編集:

reg = re.compile(r"now it is.*but now it.*", re.MULTILINE | re.DOTALL)

matches = reg.search(urllib2.urlopen(url).read())
for match in matches.group():
    print match

これは以下を出力します:

n
o
w

i
t

i
s

.
.
.

つまり、行全体ではなく文字を返します

4

4 に答える 4

2

re.MULTILINEflagを見るだけでいいと思います。そのおかげで、類似の一致を実行して、必要な行から結合されたテキストを取得できます。

編集:

完全な解決策にはre.MULTILINEre.DOTALLフラグと非貪欲な正規表現の使用が含まれます。

>>> text = """this is the first line
and this is the second line
now it is the third line
wow, the fourth line
but now it's the fifth line
etc...
etc...
etc..."""
>>> import re
>>> match = re.search('^(now it is.*?but now.*?)$', text, flags=re.MULTILINE|re.DOTALL)
>>> print match.group()
now it is the third line
wow, the fourth line
but now it's the fifth line
于 2012-04-18T23:57:32.783 に答える
2

これを行うためのジェネレーターを簡単に作成できます

def re_range(f, re_start, re_end):
    for line in f:
        if re_start.match(line):
            yield line
            break
    for line in f:
        yield line
        if re_end.match(line):
            break

そして、あなたはこのようにそれを呼び出すことができます

import re

re_start = re.compile("now it is")
re_end = re.compile("but now")
with open('in.txt') as f:
    for line in re_range(f, re_start, re_end):
        print line,
于 2012-04-19T00:07:27.120 に答える
1

そんな感じ?

import re
valid = False
for line in open("/path/to/file.txt", "r"):
    if re.compile("now it is").match(line):
        valid = True
    if re.compile("but now").match(line):
        valid = False
    if valid:
        print line

readlines()このように、ファイル全体をメモリにキャッシュする場所を使用するのとは対照的に、一度に1行だけキャッシュします。

これは、正規表現パターンがテキストブロック内で一意であることを前提としています。そうでない場合は、開始行と終了行を正確に一致させる方法に関する詳細情報を提供してください。

行の先頭で一致を確認する必要がある場合は、さらに簡単です。

valid = False
for line in open("/path/to/file.txt", "r"):
    if line.startswith("now it is"):
        valid = True
    if line.startswith("but now"):
        valid = False
    if valid:
        print line
于 2012-04-18T23:51:26.953 に答える
1
f = open("yourfile") #that is, the name of your file with extension in quotes
f = f.readlines()

f はファイル内の各行のリストになります。f[0] が最初の行、f[1] が 2 番目の行などになります。3 行目から 5 行目を取得するには、f[2:5] を使用します。

于 2012-04-18T23:46:52.387 に答える