0

\begin{frame}ファイルに含まれる行を認識するために正規表現を使用してい.texます。以下は私のコードです:

#!/usr/bin/python

import re,sys

def isEven(num):
    res = [False,True][bool(num % 2 == 0)]
    return res

textin = open(sys.argv[1]).readlines()
nline = 0
pat = r'\b\begin{frame}\b'
for line in textin:
    line = line.strip(' ')
    #print 'Test: ',line[:13]
    if re.match(pat,line):
        print 'here'
        nline += 1
    if isEven(nline):
        print '%',line.strip('\n')
    else:
        print line.strip('\n')

このプログラムは、フレーム数が偶数の場合、tex ファイルの行の前に文字 '%' を追加することを目的としています。つまり、スライド番号が偶数のスライドにコメントしたいということです。

パターンの何が間違っているか知っていますか?

4

1 に答える 1

1

パターン文字列をもう一度見てください。

r'\b\begin{frame}\b'

「\b\b」で始まることに注意してください。最初のものは単語の境界として、2 番目のものは一致させたいものの一部としてre意味しますが、それぞれの意味をどのように推測できるでしょうか?!

ちなみに、単語の境界は必要ないと思います。実際、単語の境界は一致を台無しにする可能性があります。さらに、最初にre.matchのみ一致します。Qのテキストでは、「で始まる」ではなく「含む」と言っているので、実際にはre.search.

バックスラッシュを一致させるには、パターン内でバックスラッシュを 2 つにする必要があります。また、単一のバックスラッシュを使用して、中括弧などの句読点をエスケープできます。

だから私はお勧めします...:

def isEven(n): return n%2 == 0

nline = 0
pat = r'\\begin\{frame\}'
with open(sys.argv[1]) as textin:
    for line in textin:
        line = line.strip()
        if re.search(pat,line):
            print 'here'
            nline += 1
        if isEven(nline):
            print '%', line
        else:
            print line

私はさらにいくつかの改善を行いましたが、それらはあなたの Q に直接関係するものではありません (たとえば、withファイルを開き、行ごとにループするために使用します。分割するのではなく、空白の各行を 1 回ずつ完全に削除します。 -- ただし、これらのいずれも使用する必要はありません:-)

于 2015-01-25T18:52:55.617 に答える