正则表达式以匹配摩托车名称并分别提取所有字母和数字

Regex to match motor cycle names and extract all letters and numbers separately

本文关键字:提取 数字 摩托车 正则表达式      更新时间:2023-09-26
('w{1,4})(?:'s{0,1})('d{1,4})(?:'s{0,1})('w{1,4})'s

抱歉,如果这真的是丑陋的正则表达式,但我一点也不流利。

我需要一个正则表达式函数来从摩托车名称中提取所有可能的组合,例如:

从本田CBR500R我需要获得CBR,500和R。我不确定我的正则表达式是否可以给我 CBR500 和 500R,因为这真的很甜!

某种类型的自行车名称:

Honda CBR500R
CBR 500 R
CBR 500R
CBR500 R
GS1000 S
XYZT 1000P
500ztx
KLR250 Honda
FZR 600 Suzuki
SV650
Text here XXXX 9999 XXXX 9999 XXXXX more text here

有没有办法改进我的正则表达式?让它更简单、更智能?

您可以使用

([A-Z]{2,})?['s-]*('d+)([a-z]+)?['s-]*([A-Z]*'b)

查看正则表达式演示

正则表达式匹配:

  • ([A-Z]{2,})? - 第 1 组:一个或 2 个或多个大写 ASCII 字母的 0 个序列
  • ['s-]* - 零个或多个-或空格符号
  • ('d+) - 第 2 组:一个或多个数字
  • ([a-z]+)? - 第 3 组:一个或多个 ASCII 小写字母的一个或多个或零序列
  • ['s-]* - 零个或多个-或空格符号
  • ([A-Z]*'b) - 组 4:零个或多个 ASCII 大写字母,后跟一个单词边界。

下面是 Python 中的示例提取代码:

import re
p = re.compile(r'([A-Z]{2,})?['s-]*('d+)([a-z]+)?['s-]*([A-Z]*'b)')
test_str = "Honda CBR500R'nCBR 500 R'nCBR 500R'nCBR500 R'nGS1000 S'nXYZT 1000P'n500ztx'nKLR250 Honda'nFZR 600 Suzuki'nText here XXXX 9999 XXXX 9999 XXXXX more text here"
for s in p.findall(test_str):
    print("New Entry:")
    for r in s:
        if r:
            print(r)

输出:

New Entry:
CBR
500
R
New Entry:
CBR
500
R
New Entry:
CBR
500
R
New Entry:
CBR
500
R
New Entry:
GS
1000
S
New Entry:
XYZT
1000
P
New Entry:
500
ztx
New Entry:
KLR
250
New Entry:
FZR
600
New Entry:
XXXX
9999
XXXX
New Entry:
9999
XXXXX

我想出了以下模式。不确定这是否是您所期望的(重复项不会被删除):

import re
txt = """
Honda CBR500R
CBR 500 R
CBR 500R
CBR500 R
GS1000 S
XYZT 1000P
500ztx
KLR250 Honda
FZR 600 Suzuki
SV650
Text here XXXX 9999 XXXX 9999 XXXXX more text here
"""
pattern = r'[A-Z]+'d+|'d+[A-Z]|[A-Z]+(?![a-z])|'d+[a-z]+|'d+'
print re.findall(pattern, txt)

输出为:

['CBR500', 'R', 'CBR', '500', 'R', 'CBR', '500R', 'CBR500', 'R', 'GS1000', 'S', 'XYZT', '1000P', '500ztx', 'KLR250', 'FZR', '600', 'SV650', 'XXXX', '9999', 'XXXX', '9999', 'XXXXX']

如果您还想从"CBR500R"捕获"500R":

p1 = r'[A-Z]+'d+|(?<!'d)[A-Z]+(?![a-z])|'d+[a-z]+|'d+(?![0-9A-Z])'
p2 = r''d+[A-Z]'
print re.findall(p1, txt) + re.findall(p2, txt)

输出为:

['CBR500', 'CBR', '500', 'R', 'CBR', 'CBR500', 'R', 'GS1000', 'S', 'XYZT', '500ztx', 'KLR250', 'FZR', '600', 'SV650', 'XXXX', '9999', 'XXXX', '9999', 'XXXXX', '500R', '500R', '1000P']