2012-04-18 20 views
0

I次のファイルがありますが「今では3行目はある」「しかし、今では5行目だ」これらの行番号を知らなくても、私は(これらの3つの行をコピーしないか、から始まって複数の行をコピーするにはどうすればよいですか?

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... 

ライン)? perlでは、あなたは次のようなことをします:

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

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

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

EDIT:

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 

. 
. 
. 

それは文字を返し、ない、つまり

私は(明らかにのみ行の1をグラブする)持っています完全な線

答えて

2

私はあなただけre.MULTILINE flagを参照する必要があると思います。おかげで、同様のマッチを実行して、必要な行から結合されたテキストを取得することができます。

EDIT:

完全なソリューションを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 
+0

それは良く見えますが、私はそれを使用する方法がかなりわかりません.... re.compileのようなもの(r "^今それは*ですが、今は$"、re.MULTILINE)? –

+0

@ user522962:そのようなものですが、別のフラグ(['re.DOTALL'](http://docs.python.org/library/re.html#re.DOTALL)も追加する必要があります)最後の行の残りの部分と一致するように '$'の前に '。*'を追加する必要があります。あなたは完全な解決法を見たいと思いませんか、それともあなたが問題を解決するのに十分ですか? – Tadeck

+0

私はそれにショットを与えた...私の質問で私の編集を参照してください....私は間違って何かをしています。 –

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]を使用します。

+0

私はちょうど編集をしました...行番号が分からない場合はどうすればいいですか? –

+0

@ user522962文字列の内容で一致させようとしている場合は、文字列の内容があなたの欲求を満たしているかどうかを調べるために、forループ内の行にforループを実行します。あなたが内容や行番号で一致させたくない場合は、あなたが何を求めているのかわからないので、お詫び申し上げます。 – purpleladydragons

+1

readlines()は、ファイル全体をメモリに格納するため、使用しないことをお勧めします。ファイルのサイズによっては、問題が発生する可能性があります。 –

1

これは何か?これはあなたのキャッシュ一度に一つだけのライン、あなたはメモリ内のファイル全体をキャッシュする場所readlines()を使用してに反するよう

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 

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

場合、あなたはそれがより簡単に試合を行の先頭をチェックする必要があります。

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 
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, 
関連する問題