2011-12-05 25 views
8

Tôi đang tìm một regex để khớp các từ được gạch nối trong python.Python Regex cho các từ được gạch nối

Gần nhất tôi đã quản lý để nhận được là: '\ w + - \ w + [- w +] *'

text = "one-hundered-and-three- some text foo-bar some--text" 
hyphenated = re.findall(r'\w+-\w+[-\w+]*',text) 

trả về danh sách [ 'một hundered-and-ba', 'foo -quán ba'].

Điều này gần như hoàn hảo ngoại trừ dấu gạch ngang sau dấu sau 'ba'. Tôi chỉ muốn thêm dấu gạch ngang nếu theo sau là 'từ'. tức là thay vì '[- \ w +] *' tôi cần một cái gì đó như '(- \ w +) *' mà tôi nghĩ rằng sẽ làm việc, nhưng không (nó trả về ['-three,' ']). tức là cái gì đó phù hợp | từ tiếp theo là dấu gạch ngang theo sau là từ tiếp theo là hyphen_word 0 hoặc nhiều lần |

+1

Tôi không biết bạn định sử dụng điều này cho điều gì, nhưng bạn đã xem xét các trường hợp dấu gạch ngang hoặc dấu gạch nối đầu tiên là [hợp lệ] (http://en.wikipedia.org/wiki/Hyphen) , như "thế kỷ mười chín và hai mươi" hay "nhà đầu tư sở hữu và hoạt động"? –

+1

Vấn đề chính trong biểu thức của chính bạn là các dấu ngoặc vuông. Họ không nhóm các nội dung lại với nhau, họ tạo ra một lớp nhân vật, đó là một cái gì đó hoàn toàn khác nhau. – stema

+0

Cảm ơn các đầu vào, lazyr. Tôi đã xem xét các trường hợp bạn chỉ ra, và họ sẽ không đặt ra một vấn đề. Cảm ơn bạn đã làm rõ, stema. Tôi nhận ra rằng các dấu ngoặc vuông không nhóm nội dung, nhưng chúng dẫn đến kết quả phù hợp nhất cho những gì tôi đã cố gắng làm. – Sixhobbits

Trả lời

18

Hãy thử điều này:

re.findall(r'\w+(?:-\w+)+',text) 

Ở đây chúng ta xem xét một từ có gạch nối là:

  • một số ký tự chữ
  • Tiếp theo bất kỳ số lượng:
    • một gạch nối đơn
    • theo sau là ký tự từ
Các vấn đề liên quan