2014-11-02 10 views
5

ढूँढें मान लें कि मेरे पास आवर्ती पैटर्न के साथ एक संख्या है, यानी संख्याओं की एक स्ट्रिंग मौजूद है जो प्रश्न में संख्या बनाने के लिए स्वयं को दोहराती है। उदाहरण के लिए, 1234123412341234 हो सकता है, जो 1234 अंकों को दोहराकर बनाया गया है।
मैं जो करना चाहता हूं, वह पैटर्न ढूंढें जो संख्या बनाने के लिए खुद को दोहराता है।पुनरावर्ती पैटर्न

def findPattern(num): 
    num = str(num) 
    for i in range(len(num)): 
     patt = num[:i] 
     if (len(num)/len(patt))%1: 
      continue 
     if pat*(len(num)//len(patt)): 
      return patt, len(num)//len(patt) 

हालांकि, इस: इसलिए, 1234123412341234 को देखते हुए, मैं 1234 गणना करने के लिए (और शायद 4, संकेत मिलता है कि 12341234123412341234 बनाने के लिए 4 बार दोहराया है)

मैं जानता हूँ कि मैं यह कर सकता है कि चाहते हैं थोड़ा बहुत हैकी लगता है।

In [25]: c1 = itertools.cycle(list(range(4))) 

In [26]: c2 = itertools.cycle(list(range(4))) 

In [27]: c1==c2 
Out[27]: False 

इस गणना करने के लिए एक बेहतर तरीका है: मैं मैं itertools.cycle इस्तेमाल कर सकते हैं समानता के लिए दो चक्रों, जो वास्तव में बाहर पैन नहीं है की तुलना करने लगा? (मैं एक regex के लिए खुला होगा, लेकिन मैं पता नहीं कैसे वहाँ इसे लागू करने के लिए है, जिसके कारण मैं अपने प्रयास में शामिल नहीं किया था)

संपादित:

  1. मैं डॉन यह जरूरी नहीं है कि संख्या में दोहराव पैटर्न है, इसलिए यदि कोई नहीं है तो मुझे None वापस करना होगा।
  2. अभी, मैं केवल संख्याओं/तारों का पता लगाने से चिंतित हूं जो पूरी तरह से दोहराने वाले पैटर्न से बने होते हैं। के रूप में

magic_function (78961234123412341234)

1234 पैटर्न के रूप में वापसी होगी, 4: हालांकि, बाद में, मैं होने की संभावना भी पैटर्न है कि कुछ पात्रों के बाद शुरू ढूँढने में दिलचस्पी हो जाएगा समय की संख्या में यह दोहराया है, और 4 इनपुट में पहली सूचकांक जहां पैटर्न पहले ही

+0

'771177117711' जैसे कुछ के बारे में क्या? यह बहुत मुश्किल है। –

+0

@AlexThornton: यह '7711', 3 बार, या' 1177' का एक पैटर्न है, दो बार (अग्रणी और पिछला शोर के साथ) – inspectorG4dget

+0

नियमित अभिव्यक्ति उस के लिए असफल हो जाती है। मैं देखूंगा कि मैं कुछ भी सोच सकता हूं। –

उत्तर

5
(.+?)\1+ 

कोशिश टी प्रस्तुत करता है के रूप में उनके। कब्जा पकड़ो। demo देखें। यदि आप regex 12341234123123 पर विफल है, जो None लौट जाना चाहते हैं

import re 
p = re.compile(ur'(.+?)\1+') 
test_str = u"1234123412341234" 

re.findall(p, test_str) 

एंकरों और झंडा Multiline जोड़ें।

^(.+?)\1+$ 

demo देखें।

(.+?)(?=\1+$|$) 

डब्ल्यू/g विकल्प:

0

एक तरह से एक आवर्ती पैटर्न और बार-बार समय की संख्या खोजने के लिए इस पद्धति का प्रयोग है।
यह दोहराया पैटर्न और मैचों (बार दोहराया)
गैर दोहराए गए पैटर्न (विफल रहता है) की संख्या वापसी वापस आ जाएगी होगा केवल "" मैच
दोहराया पैटर्न 2 या अधिक मैचों (समय की संख्या वापस आ जाएगी दोहराया गया)।
Demo

+0

क्या आप अपने कोड को गैर-मैचों, आदि ढूंढने का उदाहरण पोस्ट कर पाएंगे? – inspectorG4dget

+0

http://regex101.com/r/yW4aZ3/91, केवल एक मैच मिला –

संबंधित मुद्दे