2013-05-11 45 views
6

我试图找到一个正则表达式,它将两个相同的符号结尾的单词结尾,后面跟着'ter'并将它分割为两个符号。 例如:'Letter'这个词应该被分组为'Let'和'ter'。 我使用Python和这是我到目前为止已经得到:参考正则表达式组内的组

match = re.search(r'(\w*)((\w)\1(er$))', str) 
print match.group(1) #should print 'Let' 
print match.group(2) #should print 'ter' 

的问题是(\ W)\ 1指的不是正确的组,因为它是一个组内组。这是如何解决的?

在此先感谢。

+0

你的意思两个相同的符号后跟“er”? – jamylak 2013-05-11 11:30:59

+2

你没有解释表达式实际上应该做什么。我无法想象你试图将'Letter'这个词分成两半,而且几乎不可能从你的尝试中猜出你的意图。 – Tomalak 2013-05-11 11:31:10

+0

@Tomalak我们的名字都很相似 – jamylak 2013-05-11 11:33:46

回答

5

我用命名组作为参考,使他们更容易:

import re 
pattern = r""" 
      \b(?P<first_part>\w*(?P<splitter>\w)) # matches starting at a word boundary 
      (?P<last_part>(?P=splitter)er\b)  # matches the last letter of the first group 
                # plus 'er' if followed by a word boundary 
      """ 
matcher = re.compile(pattern, re.X) 
print matcher.search('letter').groupdict() 
# out: {'first_part': 'let', 'last_part': 'ter', 'splitter': 't'} 
+0

第二相同的符号,而命名组会看起来像第二组:'重.search(r'(\ w *(\ w))(\ 2er $)','letter')。groups()'但我没有看到任何方式引用非捕获组,所以拆分器仍然是在索引'1' – jamylak 2013-05-11 11:54:18

+0

那么,非捕获组意味着它不能被引用,即使在正则表达式中也是如此。 – 2013-05-11 11:56:40

+0

这将是唯一的解决方案,然后...除非'正则表达式'模块以某种方式支持 – jamylak 2013-05-11 11:57:34

1

我想第一组是一切直到并包括前两个相同的符号,第二组第二相同符号后面的 'er'

这将是:

match = re.search(r'(\w*(\w)(?=\2))(\w*er$)', str) 

print match.groups() 
# -> ('Let', 't', 'ter')