匹配Python中行开头的字符串

时间:2018-02-23 16:46:18

标签: python

我想在文本文件中的每一行的开头搜索某个模式。

以下是文本文件的内容:

module abc ( A, B, C, NSUP, PSUP, SEL );
input NSUP;
input PSUP;
input SEL;
inout A;
inout B;
output C;
//sample text input pins
//sample text output pins

我希望输出为

NSUP
PSUP
SEL
A
B
C

我尝试了下面的代码,但它打印出一个空列表作为输出:

fh=open("VamsModel","r")
contents=fh.read()
inoutPortList=re.compile(r'^(input|output|inout)\s+(\w+)')
matches = inoutPortList.finditer(contents)

for match in matches:
    print(match.group(2))

如果我从re.compile模式中删除“^”然后它可以工作,但它只会在开始时查找模式。

inoutPortList=re.compile(r'(input|output|inout)\s+(\w+)')

上面的正则表达式也会输出我不想要的文本文件的最后两行(如下所示):

//sample text input pins
//sample text output pins

当我使用“^”时,为什么我的正则表达式无效?

3 个答案:

答案 0 :(得分:6)

在整个缓冲区上使用^,您可以在缓冲区的开头查找表达式。

要在每行的开头查找表达式,请使用多行标记:

inoutPortList=re.compile(r'^(input|output|inout)\s+(\w+)',flags=re.M)

输出:

NSUP
PSUP
SEL
A
B
C

除此之外:使用正则表达式模块,始终将标记作为关键字参数传递:flags=re.M而不仅仅是re.M。它适用于re.compile,但不适用于re.sub,因为" count"参数首先出现,这会产生奇怪的问题。

答案 1 :(得分:3)

您需要使用re.MULTILINE(re.M速记)标志来指示^匹配行的开头而不是字符串:

inoutPortList=re.compile(r'^(input|output|inout)\s+(\w+)', re.M)

答案 2 :(得分:1)

如果您知道要查找的字符串,可以使用startswith代替正则表达式

if line.startswith(("input", "output", "inout")):
    print(line.split(" ", 1)[1])