(\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)
参见 regex demo
正则表达式匹配:
([A-Z]{2,})?
- 第 1 组:一个或零个 2 个或多个大写 ASCII 字母序列[\s-]*
- 零个或多个-
或空白符号(\d+)
- 第 2 组:一个或多个数字([a-z]+)?
- 第 3 组:一个或多个 ASCII 小写字母的一个或零个序列[\s-]*
- 零个或多个-
或空白符号([A-Z]*\b)
- 第 4 组:零个或多个 ASCII 大写字母后跟单词边界。
这是一个sample extraction code in 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
关于javascript - 正则表达式匹配摩托车名称并分别提取所有字母和数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35566119/