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' 开头。你的意思是第一个作为单词边界,第二个作为你想要匹配的一部分——但是怎么re可能猜到你的意思呢?!

顺便说一句,我认为您不需要单词边界-实际上它们可能会弄乱匹配。此外,re.match仅在开始时匹配;由于您在 Q 的文本中说“包含”而不是“开始于”,因此您可能实际上想要re.search.

要匹配反斜杠,您需要在模式中将其加倍。您可以使用单个反斜杠来转义标点符号,例如那些大括号。

所以我会推荐...:

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打开文件,并逐行循环;完全去除每行空白,一次,而不是分期付款;等等-- 但不必使用这些:-)。

于 2015-01-25T18:52:55.617 回答