繁体   English   中英

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

[英]Find pattern in string using regex with python 3

我有下面的字符串

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')]

我在http://regexr.com/中尝试了这种模式,结果是合适的,但在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}

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

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

invoices = []
# Your pattern was slightly incorrect
pattern = re.compile(r'IVR[/]\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}') 

# For each invoice pattern you find in string, append it to list
for invoice in pattern.finditer(string):
    invoices.append(invoice.group(1))

注意:

您还应该使用pattern.finditter()因为这样您可以在您调用string文本中迭代所有模式结果。 来自re.finditer文档:

re.finditer(pattern,string,flags = 0)返回一个迭代器,在字符串中的RE模式的所有非重叠匹配上产生MatchObject实例。 从左到右扫描字符串,并按找到的顺序返回匹配项。 结果中包含空匹配,除非它们触及另一个匹配的开头。

您可以尝试这个来检索数字,罗马,罗马和数字值:

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})

演示

片段

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)

在线运行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM