2014-06-27 172 views
1

我想将字符串拆分成匹配正则表达式模式和不匹配列表的部分的部分。周围的图案python返回匹配和不匹配的字符串模式

例如

import re 
string = 'my_file_10' 
pattern = r'\d+$' 
# I know the matching pattern can be obtained with : 
m = re.search(pattern, string).group() 
print m 
'10' 
# The final result should be as following 
['my_file_', '10'] 

回答

5

穿戴括号,使其捕获组,然后使用re.split()以产生匹配和非匹配元素的列表:

pattern = r'(\d+$)' 
re.split(pattern, string) 

演示:

>>> import re 
>>> string = 'my_file_10' 
>>> pattern = r'(\d+$)' 
>>> re.split(pattern, string) 
['my_file_', '10', ''] 

因为你在分割数字在t末尾他字符串,包含一个空字符串。

如果你只指望一个匹配,在字符串(在这里你的模式力量$),则只需使用m.start()方法获取索引切片输入字符串的结尾:

pattern = r'\d+$' 
match = re.search(pattern, string) 
not_matched, matched = string[:match.start()], match.group() 

这将返回:

>>> pattern = r'\d+$' 
>>> match = re.search(pattern, string) 
>>> string[:match.start()], match.group() 
('my_file_', '10') 
+0

这绝对回答了原来的问题。现在,我想知道什么是Pythonic方式来弄清楚*结果列表中哪些元素匹配,哪些不匹配。我需要那个,并且匹配每个元素来检查感觉不仅仅是一点点笨重。 – Jani

2

您可以使用re.split使这些单独的匹配列表,并使用filter,其过滤接rs出所有被认为是错误的元素(空字符串

>>> import re 
>>> filter(None, re.split(r'(\d+$)', 'my_file_015_01')) 
['my_file_015_', '01'] 
+0

好主意,但我需要的东西只有两个部分。例如,如果字符串是'my_file_015_01',那么您的解决方案会给['my_file_','015','_','01']。这使我的代码中的事情变得复杂。 Martijn的回答更合适。 – user1850133

+0

@ user1850133更新了答案 – hwnd