我想在文本文件中的每一行的开头搜索某个模式。
以下是文本文件的内容:
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
当我使用“^”时,为什么我的正则表达式无效?
答案 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])