如何正确分组提供的字符串?

时间:2015-10-26 13:11:59

标签: regex

我有以下正则表达式:

^([A-Za-z]{2,3}\d{6}|\d{5}|\d{3})((\d{3})?)(\d{2}|\d{3}|\d{6})(\d{2}|\d{3})$

我使用这个正则表达式来匹配不同但相似的字符串:

# MOR644-004-007-001
MOR644004007001 # string provided
# VUF00101-050-08-01
VUF001010500801 # string provided
# MF001317-077944-01
MF00131707794401 # string provided

这些字符串需要匹配/分组,因为它位于字符串的顶部,但我的问题是它没有正确分组

第一个字符串:MOR644004007001已分组:(MOR644004) (007) (001)应为(MOR644) (004) (007) (001)

第二个字符串:VUF001010500801已分组(VUF001010) (500) (801),应为(VUF00101) (050) (08) (01)

如何更改([A-Za-z]{2,3}\d{6}|\d{5}|\d{3})((\d{3})?)以便正确分组提供的字符串?

3 个答案:

答案 0 :(得分:2)

我不确定你能做你想做的事。 让我们考虑前两个字符串:

# MOR644-004-007-001
MOR644004007001 # string provided
# VUF00101-050-08-01
VUF001010500801 # string provided

现在,两个字符串都由3个字符组成,后跟12个数字。因此,给定正则表达式 R ,如果 R 不依赖于特定(序列)字符和特定(序列)数字(即,它呈现{{1} }和[A-Za-z]但不会出现,假设\dMO),那么它将以相同的方式匹配两个字符串。

因此,如果您想要操作不同的匹配,那么您需要查看某些字符或数字的特定匹配项。我们需要您提供更多数据,以便为您提供支持。

最后,我建议你看看这个工具: http://regex.inginf.units.it/(演示:http://regex.inginf.units.it/demo.html)。这是一个研究项目,自动生成一个正则表达式(给定(很多)提取的例子)。我热烈建议你尝试一下,特别是如果你知道你的情况下确实存在一个基础模式(即以0070开头的字符串必须与以VUF开头的字符串不同,但你是无法找到它。同样,您需要为引擎提供许多示例。有人说,如果不存在通用模式,那么该工具将无法找到它;)

答案 1 :(得分:1)

考虑到您对Serv的评论我说(唯一?)解决方案是为每种可能性设置一个正则表达式,例如 -

MOR(\d{3})(\d{3})(\d{3})(\d{3})|VUF(\d{5})(\d{3})(\d{2})(\d{2})|MF(\d{6})(\d{6})(\d{2})

然后使用执行环境(JS / php / python - 你还没有提供哪一个)将部分拼凑在一起。

请参阅regex101 here上的示例。请注意,替换仅作为示例,仅匹配第二个字符串。

此致

答案 2 :(得分:0)

看看这个。我使用了被称为命名组的东西。正如其他人早先指出的那样,为每个字符串设置一个正则表达式代码会更好。我在这里显示了第一个字符串MOR644004007001。您可以轻松扩展其他两个字符串:

import re

# MOR644-004-007-001
MOR = "MOR644004007001" # string provided
# VUF00101-050-08-01
VUF = "VUF001010500801" # string provided
# MF001317-077944-01
MF = "MF00131707794401" # string provided

MORcompile = re.compile(r'(?P<first>\w{,6})(?P<second>\d{,3})(?P<third>\d{,3})(?P<fourth>\d{,3})')
MORsearch = MORcompile.search(MOR.strip())
print MORsearch.group('first')
print MORsearch.group('second')
print MORsearch.group('third')
print MORsearch.group('fourth')

MOR644
004
007
001