使用正则表达式和python 3查找字符串中的模式

使用正则表达式和python 3查找字符串中的模式,python,regex,algorithm,python-3.x,Python,Regex,Algorithm,Python 3.x,我有下面这样的绳子 string=“您的发票号IVR/20170531/XVII/V/12652967和IVR/20170531/XVII/V/13652967” 我想使用带有此模式的正则表达式将发票号IVR/20170531/XVII/V/12652967和IVR/20170531/XVII/V/13652967放入列表中 result = re.findall(r'INV[/]\d{8}[/](M{1,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|

我有下面这样的绳子

string=“您的发票号IVR/20170531/XVII/V/12652967和IVR/20170531/XVII/V/13652967”

我想使用带有此模式的正则表达式将发票号IVR/20170531/XVII/V/12652967和IVR/20170531/XVII/V/13652967放入列表中

       result = re.findall(r'INV[/]\d{8}[/](M{1,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|M{0,4}(CM|C?D|D?C{1,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|M{0,4}(CM|CD|D?C{0,3})(XC|X?L|L?X{1,3})(IX|IV|V?I{0,3})|M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|I?V|V?I{1,3}))[/](M{1,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|M{0,4}(CM|C?D|D?C{1,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|M{0,4}(CM|CD|D?C{0,3})(XC|X?L|L?X{1,3})(IX|IV|V?I{0,3})|M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|I?V|V?I{1,3}))[/]\d{7,9}',string)  
但结果是

[('XVII',  '', '','',  '', '',  '',  '', 'X',  'VII', '',  '', '',  'V','','','',  '', '',  '', '',  '', '',  '', '',  'V')]

我在中尝试了此模式,结果是适当的,但在python中不是

您需要在所有组之前添加
?:
,以便使用

string = "your invoice number IVR/20170531/XVII/V/12652967 and IVR/20170531/XVII/V/13652967"
results = []
matches = re.finditer(regexpattern, string)
for matchNum, match in enumerate(matches):
    results.append(match.group())
尝试使用此正则表达式:

IVR[/]\d{8}[/](?:M{0,4}(?:CM|CD|D?C{0,3})|(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3}))[/](?:M{0,4}(?:CM|CD|D?C{0,3})|(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3}))[/]\d{8}

基本上,您需要为每个组添加
?:

您需要在所有组之前添加
?:
,以便使用

尝试使用此正则表达式:

IVR[/]\d{8}[/](?:M{0,4}(?:CM|CD|D?C{0,3})|(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3}))[/](?:M{0,4}(?:CM|CD|D?C{0,3})|(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3}))[/]\d{8}

基本上,您需要为每个组添加
?:

您应该修改您的模式,在整个正则表达式周围添加普通括号,然后使用第一个反向引用访问该文本。您可以阅读更多关于反向引用的信息

注意:

您还应该使用
pattern.finditer()
,因为这样可以通过调用
string
的文本中的所有模式结果进行迭代。从re.finditer文档:

re.finditer(模式、字符串、标志=0) 返回一个迭代器 针对RE的所有非重叠匹配的MatchObject实例 字符串中的模式。字符串从左到右扫描,并匹配 按找到的顺序返回。空匹配项包含在 结果,除非他们触及另一场比赛的开始


您应该修改您的模式,在整个正则表达式周围添加普通括号,然后使用第一个反向引用访问该文本。您可以阅读更多关于反向引用的信息

注意:

您还应该使用
pattern.finditer()
,因为这样可以通过调用
string
的文本中的所有模式结果进行迭代。从re.finditer文档:

re.finditer(模式、字符串、标志=0) 返回一个迭代器 针对RE的所有非重叠匹配的MatchObject实例 字符串中的模式。字符串从左到右扫描,并匹配 按找到的顺序返回。空匹配项包含在 结果,除非他们触及另一场比赛的开始


您可以尝试使用此选项检索数字、罗马、罗马和数字值:

[代码>IVR\/[代码>IVR部分部分部分部分的代码>IVR部分部分部分部分的部分部分部分部分的除除除除除上述以外的其他部分部分以外的其他部分部分部分部分的其他部分部分部分的除除除除除除除除除除上述3名以外以外的其他学校以外的其他部分部分部分部分部分部分部分部分部分的其他部分部分部分部分部分的部分部分部分部分部分的部分部分的部分部分的除除除除除除除上述上述上述上述上述的部分部分部分部分的部分的部分外,其他部分部分部分的部分的部分的部分部分的部分部分的部分的部分部分部分部分部分的部分的部分的部分的部分的部分部分部分部分的部分的部分的部分的部分的部分部分的部分的部分的部分部分部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的除除除除除除除除)\/(\d{7,9})

片段

import re

string = "your invoice number IVR/20170531/XVII/V/12652967 and IVR/20170531/XVII/V/13652967"

pattern = r"IVR\/(\d{8})\/(M{0,4}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3}))\/(M{0,4}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3}))\/(\d{7,9})"

for match in re.findall(pattern, string):
    print(match)

您可以尝试使用此选项来检索数字、罗马、罗马和数字值:

[代码>IVR\/[代码>IVR部分部分部分部分的代码>IVR部分部分部分部分的部分部分部分部分的除除除除除上述以外的其他部分部分以外的其他部分部分部分部分的其他部分部分部分的除除除除除除除除除除上述3名以外以外的其他学校以外的其他部分部分部分部分部分部分部分部分部分的其他部分部分部分部分部分的部分部分部分部分部分的部分部分的部分部分的除除除除除除除上述上述上述上述上述的部分部分部分部分的部分的部分外,其他部分部分部分的部分的部分的部分部分的部分部分的部分的部分部分部分部分部分的部分的部分的部分的部分的部分部分部分部分的部分的部分的部分的部分的部分部分的部分的部分的部分部分部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的部分的除除除除除除除除)\/(\d{7,9})

片段

import re

string = "your invoice number IVR/20170531/XVII/V/12652967 and IVR/20170531/XVII/V/13652967"

pattern = r"IVR\/(\d{8})\/(M{0,4}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3}))\/(M{0,4}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3}))\/(\d{7,9})"

for match in re.findall(pattern, string):
    print(match)

您提供的示例字符串中的发票编号是哪一部分?
IVR[^\s]+
对吗?我想您需要在您的模式中添加一些
。。。IVR/[number]/[roman]/[roman]/[number]@l'l'l与您给出的示例字符串中的发票编号的哪一部分相同?
IVR[^\s]+
对吗?我想您需要在模式中添加一些
。。。IVR/[number]/[roman]/[roman]/[number]@l'l'l与此结果相同