在字符串中查找标准化文本模式

Finding Standardized Text Pattern In String

我们正在查找一组非常大的标准数字模式字符串,以便找到绘图 sheet 数字。例如,有效的 sheet 号码是:A-101、A101、C-101、C102、E-101、A1、C1、A-100-A 等。

它们可能包含在一个字符串中,例如 "The sheet number is A-101 first floor plan"

sheet 数字模式总是由相似的字符类型模式(数字、字符和分隔符 (-, space, _))组成,如果我们将所有有效数字转换为模式指示字符类型(A-101=ASNNN、A101=ANNN、A1 - AN 等)只有约 100 个有效模式。

我们的计划是将字符串中的每个字符转换为其字符类型,然后搜索有效模式。所以问题是搜索 "AAASAAAAASAAAAAASAASASNNNSAAAAASAAAAASAAAA" 以找到 100 个有效字符类型模式之一的最佳方法是什么。我们考虑过对每个模式进行 100 次文本搜索,但似乎有更好的方法可以找到候选模式,然后搜索它是否是 100 个有效模式之一。

使用正则表达式

import re

re.findall("[A-Z][-_ ]?[0-9]+",text)

解决方案

是你想要的吗?

import re

pattern_dict = {
    'S': r'[ _-]',
    'A': r'[A-Z]',
    'N': r'[0-9]',
}

patterns = [
    'ASNNN',
    'ANNN',
    'AN',
]

text = "A-1 A2 B-345 C678 D900 E80"

for pattern in patterns:
    converted = ''.join(pattern_dict[c] for c in pattern)
    print(pattern, re.findall(rf'\b{converted}\b', text))

输出:

ASNNN ['B-345']
ANNN ['C678', 'D900']
AN ['A2']

解释

  • rf'some\b {string}': r-string 和 f-string 的组合。
  • r'some\b':原始字符串。它可以防止 python 字符串转义。所以它与 'some\b'
  • 相同
  • f'{string}':文字格式字符串。 Python 3.6+ 支持这种语法。它类似于 '{}'.format(string).
  • 因此您可以将 rf'\b{converted}\b' 更改为 '\b' + converted + '\b'
  • \b in regex: 它匹配单词边界。
    bookmark_strings = []
    bookmark_strings.append("I-111 - INTERIOR FINISH PLAN & FINISH SCHEDULE")
    bookmark_strings.append("M0.01   SCHEDULES & CALCULATIONS")
    bookmark_strings.append("M-1 HVAC PLAN - OH Maple Heights PERMIT")
    bookmark_strings.append("P-2 - PLUMBING DEMOLITION")

    pattern_dict = {
        'S': r'[. _-]',
        'A': r'[A-Z]',
        'N': r'[0-9]',
    }
    patterns = [
        'ASNNN',
        'ANSNN',
        'ASN',
        'ANNN'
    ]
    for bookmark in bookmark_strings:
        for pattern in patterns:
            converted = ''.join(pattern_dict[c] for c in pattern)
            if len(re.findall(rf'\b{converted}\b', bookmark)) > 0:
                print ("We found a match for pattern - {}, value = {} in bookmark {}".format(pattern, re.findall(rf'\b{converted}\b', bookmark) , bookmark))  

输出:

We found a match for pattern - ASNNN, value = ['I-111'] in bookmark I-111 - INTERIOR FINISH PLAN & FINISH SCHEDULE
We found a match for pattern - ANSNN, value = ['M0.01'] in bookmark M0.01   SCHEDULES & CALCULATIONS
We found a match for pattern - ASN, value = ['M-1'] in bookmark M-1 HVAC PLAN - OH Maple Heights PERMIT
We found a match for pattern - ASN, value = ['P-2'] in bookmark P-2 - PLUMBING DEMOLITION