0

我有一个文本文件(比如 test.txt),例如

a  ......
aa ......
a+a .....
aa+ .....
a+  .....
aaa .....
.........

现在我想找到任何特定字符串的行号,例如'a'、'aa+'等。我尝试使用正则表达式找到输入字符串的完全匹配。

name='a'

import re
p = re.compile(r'\b'+re.escape(name)+ r'\b')

i=0
with open('test.txt') as inpfile:
    for num, line in enumerate(inpfile):
        if p.search(line):
            print num

程序应该只打印“0”,但打印 0、2、4。

我的预期输出是

name='a'

输出:0

name='aa'

输出:1

name='aa+'

输出:3等等...

我知道我上面使用的正则表达式不正确。但是,如果您分享您的评论/建议以编译正则表达式以使其为所有模式提供所需的输出,这将很有帮助。

谢谢。

4

3 回答 3

1

为什么它打印 2 和 4?a+a并且a+两者都包含a由单词边界包围,与您使用 . 指定的完全一样\b。也许您想匹配行的开头和结尾?例如

name='a'

import re
p = re.compile('^'+re.escape(name)+ '$')

with open('test.txt') as inpfile:
    for num, line in enumerate(inpfile):
        if p.search(line.rstrip(r'\n')):
            print num

但是,如果您希望完全匹配该行,为什么还要麻烦使用正则表达式呢?

name='a'

with open('test.txt') as inpfile:
    for num, line in enumerate(inpfile):
        if name == line.rstrip(r'\n'):
            print num
于 2013-07-23T15:10:41.610 回答
1

问题在于准确理解您的正则表达式。用通俗的话来说,您正在匹配表达式:

“单词边框”后跟一个“a”,然后是另一个“单词边框”

这就是为什么匹配行 0 (a)、2 (a+a) 等等。此处,空格和不可打印字符(行首、行尾)和“+”标记词尾

于 2013-07-23T15:10:53.547 回答
0

你不应该使用\b. 它将匹配a+a, a+。我想你可能想要^a$

于 2013-07-23T15:11:44.797 回答