在字符串中查找标准化文本模式
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
我们正在查找一组非常大的标准数字模式字符串,以便找到绘图 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