簡體   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