在 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
打开文件,并逐行循环;去除每一行空白完全一次,而不是分期付款;等等——但您没有使用这些中的任何一个:-).
我正在使用正则表达式来识别 .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
打开文件,并逐行循环;去除每一行空白完全一次,而不是分期付款;等等——但您没有使用这些中的任何一个:-).