2013-05-11 27 views
6

Tôi đang cố gắng tìm một regex nhóm một từ kết thúc bằng hai biểu tượng giống hệt nhau theo sau là 'ter' và chia tách nó trên hai biểu tượng. Ví dụ: Từ 'Thư' phải được nhóm thành 'Hãy' và 'ter'. Tôi đang sử dụng python và đây là những gì tôi đã nhận được cho đến nay:Hãy tham khảo nhóm bên trong nhóm với Regex

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

Vấn đề là những (\ w) \ 1 không đề cập đến các nhóm đúng, bởi vì đó là một nhóm bên trong một nhóm. Cách này được giải quyết như thế nào?

Xin cảm ơn trước.

+0

bạn có nghĩa là hai biểu tượng giống hệt nhau theo sau là 'er'? – jamylak

+2

Bạn không giải thích biểu thức * thực sự * phải làm gì. Tôi không thể tưởng tượng rằng bạn đang cố gắng để tách từ "Thư" thành hai nửa và gần như không thể đoán được ý định của bạn từ nỗ lực của bạn. – Tomalak

+0

@Tomalak tên của chúng tôi là rất giống nhau – jamylak

Trả lời

5

Tôi sử dụng các nhóm tên là mà làm cho chúng dễ dàng hơn tham khảo:

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

Không có nhóm được đặt tên như sau: .search (r '(\ w * (\ w)) (\ 2er $)', 'letter'). groups() 'nhưng tôi không thấy bất kỳ cách nào để tham chiếu đến nhóm không chụp vì vậy bộ chia sẽ vẫn là tại chỉ số '1' – jamylak

+0

Vâng, nhóm không chụp có nghĩa là nó không thể được tham chiếu, ngay cả trong biểu thức chính quy. –

+0

đây sẽ là giải pháp duy nhất sau đó ... trừ khi module 'regex' bằng cách nào đó đã hỗ trợ cho điều đó – jamylak

1

Tôi muốn nhóm đầu tiên là tất cả mọi thứ cho đến và bao gồm cả đầu tiên của hai biểu tượng giống hệt nhau, nhóm thứ hai thứ hai giống hệt nhau biểu tượng tiếp theo là 'er'

Đó sẽ là:

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

print match.groups() 
# -> ('Let', 't', 'ter') 
Các vấn đề liên quan