2016-02-26 49 views
0

我想忽略空格並解析(int, int) xx (int, int)這樣的模式。對於爲例,忽略正則表達式中的空格

import re 
m = re.match(r"[\s]*\([\s]*(\d+)[\s]*,[\s]*(\d+)[\s]*\)[\s]*xx[\s]*\([\s]*(\d+)[\s]*,[\s]*(\d+)[\s]*\)[\s]*", " (2, 74) xx (5 ,6), physicist") 
print (m.group(0)) # (2, 74) xx (5 ,6) 
print (m.group(1)) # 2 
print (m.group(2)) # 74 
print (m.group(3)) # 5 
print (m.group(4)) # 6 

正如你所看到的,在我的模式有很多[\s]*代表零個或多個空格。有沒有更簡單的方法來編寫這種模式?

+0

你不能擺脫'\ s',但你可以擺脫''和']'。只需用'\ s'替換'[\ s]'。 –

+0

難道你不能只用're.sub'刪除空白,然後對該字符串進行操作? – timgeb

+0

也許你正在尋找一個詞法分析器(例如'ply')?或者,提供更多的輸入/期望輸出字符串。 – Jan

回答

4

我不知道烤成正則表達式的方法,但想到的最簡單的方法是使用一個簡單的字符串替換:

import re 
m = re.match(r"\((\d+),(\d+)\)xx\((\d+),(\d+)\)", " (2, 74) xx (5 ,6), physicist".replace(' ', '')) 
print (m.group(0)) # (2,74)xx(5,6) 
print (m.group(1)) # 2 
print (m.group(2)) # 74 
print (m.group(3)) # 5 
print (m.group(4)) # 6 

你也可以使用正則表達式來刪除任何類型的空白(不只是空格):

import re 
s = re.sub(r'\s+', '', ' (2, 74) xx (5 ,6), physicist') 
m = re.match(r"\((\d+),(\d+)\)xx\((\d+),(\d+)\)", s) 
print (m.group(0)) # (2,74)xx(5,6) 
print (m.group(1)) # 2 
print (m.group(2)) # 74 
print (m.group(3)) # 5 
print (m.group(4)) # 6 
1

如果你想簡化你的特定的模式,你可以在一個獨立的步驟之前消除所有的空格,因爲它們與你的模式無關。

例子:

import re 
input = ' (2, 74) xx (5 ,6), physicist' 
m = re.match(r"\((\d+),(\d+)\)xx\((\d+),(\d+)\)", input.replace(' ', '') 
+1

這將是一個很大用一個例子 – SirParselot

+0

更好的你是完全正確的,謝謝。 –

1

我想你想要的全部就是獲得所有4個整數,這樣你就可以刪除所有空格,然後匹配

import re 
a = '( 2 , 74) xx (5  , 6)' 
b = re.sub(r'\s+','',a) 
m = re.match(r'\((\d+),(\d+)\)xx\((\d+),(\d+)\)',b) 
print (m.group(0)) # (2,74)xx(5,6) 
print (m.group(1)) # 2 
print (m.group(2)) # 74 
print (m.group(3)) # 5 
print (m.group(4)) # 6 
2

直截了當的答案是NO 。即使他們只是空白的,但事實是他們都是人物,因此,他們是模式的一部分。我認爲這裏有一些方法

  1. 通過刪除不需要的空格來預處理您的字符串。
  2. 找到另一種表達模式的方法。
  3. 使用替代方法進行匹配。

例如

>> re.findall(r'\d+', " (2, 74) xx (5 ,6), physicist") 
['2', '74', '5', '6']