在Python中使用正则表达式中的字符反斜杠和大括号

时间:2015-01-25 18:46:43

标签: python regex backslash curly-brackets

我使用正则表达式来识别\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文件中的行之前。换句话说,我想评论幻灯片编号是否均匀的幻灯片。

你知道模式中有什么问题吗?

1 个答案:

答案 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打开文件,并逐行循环;删除每一行完全,一次,而不是分期;等等 - 但你不 使用以下任何一种: - )。