2016-11-11 82 views
3

我已經做出一個正則表達式匹配正是這種模式 這裏的例子匹配特定的模式正則表達式

JK + 6.00,PP * 2,ZZ,GROUPO

有匹配對於每個組像

匹配1

  • JK
  • +
  • 6.00

第2場

  • PP
  • *

匹配3

  • ZZ

匹配4

  • GROUPO

所以逗號分隔的 (2〜12全部大寫字母)[可選(塊+或*)和a(正數0 [.0 [0]])

此塊成功解析模式

(?P<block>(?P<subject>[A-Z]{2,12})(?:(?P<operation>\*|\+)(?P<value>\d+(?:.?\d{1,2})?))?) 

我們有

(?P<subject>[A-Z]{2,12}) 

(?P<value>\d+(?:.?\d{1,2})?) 

所有可選操作部(值的範圍內)的受試者組

(?:(?P<operation>\*|\+)(?P<value>\d+(?:.?\d{1,2})?))? 

但如果字符串不完全匹配模式 正則表達式必須失敗,這就是問題所在

我試過,但不起作用

^(?P<block>(?P<subject>[A-Z]{2,12})(?:(?P<operation>\*|\+)(?P<value>\d+(?:.?\d{1,2})?))?)(?:,(?P=block))*$ 

什麼建議嗎?

PS。我使用Python重新

+0

你在找什麼花樣呢? (2個不同的字母)+(時間戳),(2個同一個字母)*(1個數字),(2個同一個字母),(一個字符串)'? – Olian04

+0

是逗號分隔的塊(2到12個大寫字母)[opt。 (+或*)和數字] – Misterfrederx

回答

2

我個人會採取2步驟解決方案,首先檢查整個字符串是否適合您的模式,然後提取您想要的組。

對於整體檢查,您可能希望使用^(?:[A-Z]{2,12}(?:[*+]\d+(?:\.\d{1,2})?)?(?:,|$))*$作爲模式,它基本上包含您的模式,(?:,|$)與分隔符和錨點匹配。

我也調整了一下你的模式,到(?P<block>(?P<subject>[A-Z]{2,12})(?:(?P<operation>[*+])(?P<value>\d+(?:\.\d{1,2})?))?)。我已將您的運營模式中的(?:\*|\+)[+*]替換爲您的價值模式中的\.,.?

A(非常基本的)Python實現可能看起來像

import re 
str='JK+6.00,PP*2,ZZ,GROUPO' 
full_pattern=r'^(?:[A-Z]{2,12}(?:[*+]\d+(?:\.\d{1,2})?)?(?:,|$))*$' 
extract_pattern=r'(?P<block>(?P<subject>[A-Z]{2,12})(?:(?P<operation>[*+])(?P<value>\d+(?:\.\d{1,2})?))?)' 
if re.fullmatch(full_pattern, str): 
    for match in re.finditer(extract_pattern, str): 
     print(match.groups()) 

http://ideone.com/kMl9qu

+0

是的,這絕對是一個解決方案,不知道爲什麼我沒有想到過!也感謝你的優化 – Misterfrederx

+0

你知道爲什麼我做的正則表達式不起作用嗎?我定義了工作的'block'組,爲什麼^ block(,block)* $不是? mmmm – Misterfrederx

+1

因爲它是反向引用,所以它試圖再次匹配文字匹配,而不是模式。 –

0

我猜這就是你要找的模式:

(2個不同的字母)+(同信2)(時間標記),*(1號) (2相同的字母),(串)

如果那的情況下,此正則表達式會做的伎倆:

^(\w{2}\+\d{1,2}\.\d{2}),((\w)\3\*\d),((\w)\5),(\w+)$

演示:https://regex101.com/r/8B3C6e/2

+0

看看[正則表達式](https://regex101.com/r/tH5j5t/1)我做了,它採取正確的信息,但不會使字符串無效,如果模式是錯誤的 – Misterfrederx

+0

@Misterfrederx你測試了什麼? – Olian04