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

Working with the characters backslash and curly brackets in regular expressions in Python

我正在使用正则表达式来识别 .tex 文件中包含 \begin{frame} 的行。下面是我的代码:

#!/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文件的帧数为偶数的情况下,在行前添加字符'%'。换句话说,我想评论幻灯片编号为偶数的幻灯片。

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

再次查看您的模式字符串:

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

注意它以“\b\b”开头。您的意思是第一个作为单词边界,第二个作为您要匹配的内容的一部分——但是 re 怎么可能猜出您的意思?!

顺便说一句,我认为您不需要单词边界——事实上它们可能会弄乱匹配。此外, re.match 只匹配开头;因为你在 Q 的文本中说 "contain" 而不是 "start with",你可能实际上想要 re.search.

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

所以我会推荐...:[=​​16=]

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

我做了一些改进,但它们与您的问题没有直接关系(例如,使用 with 打开文件,并逐行循环;去除每一行空白完全一次,而不是分期付款;等等——但您没有使用这些中的任何一个:-).