2011-12-05 10 views
8

मैं अजगर में हाइफेनेटेड शब्दों से मेल खाने के लिए एक रेगेक्स की तलाश में हूं।पाइथन रेगेक्स हाइफेनेटेड शब्दों के लिए

निकटतम मैं पाने में कामयाब रहे है: '\ w + - \ w + [- w +] *'

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

जो सूची लौटाती है [ 'एक hundered और तीन', 'foo -पट्टी ']।

यह 'तीन' के बाद पिछला हाइफ़न को छोड़कर लगभग सही है। यदि केवल 'शब्द' के बाद मैं अतिरिक्त हाइफ़न चाहता हूं। यानी '[- \ w +] *' की बजाय मुझे कुछ चाहिए ('- \ w +) *' जो मैंने सोचा था कि काम करेगा, लेकिन नहीं (यह ['-three,' '] लौटाता है)। यानी कुछ जो मेल खाता है | शब्द के बाद हाइफ़न के बाद शब्द के बाद hyphen_word शून्य या अधिक बार |

+1

मैं क्या आप के लिए यह उपयोग करने की योजना पता नहीं है, लेकिन आप ऐसे मामलों में जहां पीछे या पहले से जुड़ा हुआ हाइफन है पर विचार किया है [वैध] (http://en.wikipedia.org/wiki/Hyphen) , जैसे "उन्नीसवीं- और बीसवीं शताब्दी" या "निवेशक-स्वामित्व वाली और संचालित"? –

+1

अपनी अभिव्यक्ति में मुख्य समस्या वर्ग ब्रैकेट हैं। वे एक साथ सामग्री को समूहबद्ध नहीं करते हैं, वे एक चरित्र वर्ग बनाते हैं, जो कुछ अलग है। – stema

+0

इनपुट के लिए धन्यवाद, आलसी। मैंने उन मामलों पर विचार किया है जिन्हें आप इंगित करते हैं, और वे कोई समस्या नहीं उठाएंगे। स्पष्टीकरण, स्टेमा के लिए धन्यवाद। मुझे एहसास हुआ कि स्क्वायर ब्रैकेट्स ने सामग्री को समूहित नहीं किया है, लेकिन इसके परिणामस्वरूप मैं जो करने का प्रयास कर रहा था उसके लिए निकटतम मैच हुआ। – Sixhobbits

उत्तर

18

इस प्रयास करें:

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

यहाँ हम होने के लिए एक हाइफन शब्द पर विचार करें:

  • शब्द वर्ण के एक नंबर
  • के किसी भी संख्या के द्वारा पीछा किया:
    • एक भी हाइफन
    • शब्द वर्ण
संबंधित मुद्दे