Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何正确分组提供的字符串?_Regex - Fatal编程技术网

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

Regex 如何正确分组提供的字符串?,regex,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 MF0013

我有以下正则表达式:

^([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)

第二个字符串:
VUF01010500801
分组为
(VUF01010)(500)(801)
,应该是
(VUF0101)(050)(08)(01)


我怎样才能更改
([A-Za-z]{2,3}\d{6}\d{5}\d{3})(\d{3})
,使它能够正确地对提供的字符串进行分组?

我不确定您是否可以做您想做的事情。 让我们考虑前两个字符串:

# MOR644-004-007-001
MOR644004007001 # string provided
# VUF00101-050-08-01
VUF001010500801 # string provided
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
现在,两个字符串都由3个字符和12位数字组成。因此,给定正则表达式R,如果R不依赖于特定(序列)字符和特定(序列)数字(即,它表示
[a-Za-z]
\d
,但不表示,比如说,
MO
0070
),那么它将以相同的方式匹配这两个字符串

因此,如果要进行不同的匹配,则需要查看特定字符或数字的特定匹配。我们需要您提供更多数据,以便向您提供答案

最后,我建议您看看这个工具:
(演示:)。这是一个研究项目,可以自动生成给定(许多)提取示例的正则表达式。我强烈建议您尝试一下,尤其是如果您确实知道您的案例中存在底层模式(即以
VUF
开头的字符串必须与以
MOR
开头的字符串进行不同的匹配),但您无法找到它。同样,您需要为引擎提供许多示例。也就是说,如果通用模式不存在,那么工具将找不到它;)

考虑到您对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——您还没有提供哪一个)将各个部分组合在一起

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


问候

看看这个。我使用了所谓的命名组。正如前面其他人指出的,最好每个字符串有一个正则表达式代码。我在这里显示了第一个字符串,
mor644007001
。您可以轻松地展开其他两个字符串:

# MOR644-004-007-001
MOR644004007001 # string provided
# VUF00101-050-08-01
VUF001010500801 # string provided
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
重新导入
#MOR644-004-007-001
MOR=“mor644007001”#提供了字符串
#VUF0101-050-08-01
VUF=“vuf01010500801”#提供了字符串
#MF001317-077944-01
MF=“MF00131707794401”#提供了字符串
MORcompile=re.compile(r'(?P\w{,6})(?P\d{,3})(?P\d{,3})(?P\d{,3}))
MORsearch=MORcompile.search(MOR.strip())
打印MORsearch.group(“第一个”)
打印MORsearch.group(“第二个”)
打印MORsearch.group(“第三个”)
打印MORsearch.group(“第四个”)
MOR644
004
007
001

您如何区分
MOR644004007001
VUF01010500801
?我看不出您要根据哪个模式进行分组。你能解释一下为什么ex1中的第一组是6个字符,而在第二个示例中是8个字符长吗?看起来你有2-3个字母,后面是7-18个数字。您需要在正则表达式中或之后表达拆分这些数字的规则。正则表达式是贪婪的,所以当有选择时,早期的组将使用数字。@Renier仅通过查看字符串,您如何人工确定它是在6个字符后拆分还是在8个字符后拆分?如果您无法在没有依赖项的情况下逻辑地描述此规则,则很难将其重新表述为正则表达式。这就是我想问你的。这真是令人心碎。我只能去。我希望这会有点帮助。谢谢你的建议和帮助。。。这似乎是解决我问题的可行办法。顺便说一句,执行环境是python。