注:这是我的previous question的转载,试图澄清。我希望它更清楚
我有一个文件,其中有一大堆行,其中大多数包含我称之为“名称”(一个字母数字字符字符串,可能有下划线/空格,但没有其他字符),在大多数情况下还有一个=
和一些数字和特殊字符。大多数行都包含其中的一些。有时“名称”前面有其他字符,例如:
或!
或其他字符
更棘手的是,有时“名称”是其他“名称”的子集。例如:
# ignore the line numbers 00| etc.
01| 1 <= foo bar baz = 2 <= 3
02| :NI=5
03| :PENG = 7
04| 42 <= foo = 50 <= 90
05| bar = 27
06| NI PENG NEEWOM = 1000
07| 2 <= PENG2 = 3 <= 4
08| PENG PENG PENG
09| PENG=5
10| NI = 3
11| foo3 bar = 7
12| :fo4o=2
例如,这里foo
是第4行中的整个“名称”,但不是第1行中的“名称”是foo bar baz
。同样PENG
是第3行和第9行中的整个“名称”,但不是第6行(NI PENG NEEWOM
)、第7行(PENG2
)或第8行(PENG PENG PENG
)bar
是第5行中的整个“名称”,但不是第1行(foo bar baz
)或第11行(foo3 bar
)
我希望能够识别一行,其中给定的搜索键是一个完整的名称,但不是名称的一部分。同样,“名称”的规则是,它是字母数字/下划线/空格字符的连续字符串,而不是其他字符,例如=
、:
、!
等
如果有帮助,则在所有相关行中,整个名称后面都会有一个=
不需要在一行代码中完成-如果需要两个步骤来识别该行,然后将其拉出,就可以了
我可以想到的另一种方法是将每一行解析成块,拆分成每个“名称”都是一个完整的块,然后将搜索键与整个块匹配:
for line in text:
chunks = line.split(<any non-alphanumeric/underscore/space character>)
if key in chunks:
return True
但这似乎是相当低效的,拆分文本中的每一行(我不知道如何拆分)。但它得到了这个想法
使用以下带有标志
re.I
的正则表达式在一行中查找“名称”:[a-z_]
-匹配字母或下划线字符[a-z0-9_]*
-匹配0个或多个字母数字或下划线字符(?: +[a-z_][a-z0-9_]*)*
-匹配0组或多组:一个或多个空格,后跟字母或下划线,后跟0个或多个字母数字或下划线字符实际上,“名称”的每个部分都必须以字母或下划线字符(而不是数字)开头
See Regex Demo
印刷品:
相关问题 更多 >
编程相关推荐