用正则表达式识别文本中包含完整“名称”的行(更新的问题)

2024-05-14 13:39:46 发布

您现在位置:Python中文网/ 问答频道 /正文

注:这是我的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 PENGbar是第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

但这似乎是相当低效的,拆分文本中的每一行(我不知道如何拆分)。但它得到了这个想法


Tags: 字符串名称foo字母linebar数字baz
1条回答
网友
1楼 · 发布于 2024-05-14 13:39:46

使用以下带有标志re.I的正则表达式在一行中查找“名称”:

[a-z_][a-z0-9_]*(?: +[a-z_][a-z0-9_]*)*
  1. [a-z_]-匹配字母或下划线字符
  2. [a-z0-9_]*-匹配0个或多个字母数字或下划线字符
  3. (?: +[a-z_][a-z0-9_]*)*-匹配0组或多组:一个或多个空格,后跟字母或下划线,后跟0个或多个字母数字或下划线字符

实际上,“名称”的每个部分都必须以字母或下划线字符(而不是数字)开头

See Regex Demo

import re

text = """1 <= foo bar baz = 2 <= 3
 :NI=5
| :PENG = 7
 42 <= foo = 50 <= 90
 bar = 27
 NI PENG NEEWOM = 1000
 2 <= PENG2 = 3 <= 4
 PENG PENG PENG
 PENG=5
 NI = 3
 foo3 bar = 7
 :fo4o=2"""

lines = text.strip().split('\n')

def find(key):
    for line in lines:
        m = re.search(r'[a-z_][a-z0-9_]*(?: +[a-z_][a-z0-9_]*)*', line, re.I)
        if m:
            name = m[0]
            if key == name:
                print(line)
                return True

print(find('NI PENG NEEWOM'))

印刷品:

 NI PENG NEEWOM = 1000
True

相关问题 更多 >

    热门问题