我使用正则表达式来识别\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文件中的行之前。换句话说,我想评论幻灯片编号是否均匀的幻灯片。
你知道模式中有什么问题吗?
答案 0 :(得分: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
打开文件,并逐行循环;删除每一行完全,一次,而不是分期;等等 - 但你不 使用以下任何一种: - )。