2017-02-15 4 views
6

मेरे पास स्ट्रिंग्स की नेस्टेड सूची है जिसे मैं उन्हें तारीख निकालना चाहता हूं। दिनांक स्वरूप है:पांडा एक्स्ट्रेक्टॉल() रेगेक्स दिए गए सभी मामलों को निकालने नहीं कर रहा है?

import pandas as pd 
df = pd.DataFrame({'blobs':['6-Feb- 1 4 Facebook’s virtual-reality division created a 3-EBÚ7 11 network of 500 free demo stations in Best Buy stores to give people a taste of VR using the Oculus Rift 90 GT 48 headset. But according to a Wednesday report from Business Insider, about 200 of the demo stations will close after low interest from consumers. 17-Feb-2014', 
         'I think in a store environment getting people to sit down and go through that experience of getting a headset on and getting set up is quite a difficult thing to achieve,” said Geoff Blaber, a CCS Insight analyst. 29—Oct-2012 Blaber 32 FAX 2978 expects that it will get easier when companies can convince 18-Oct-12 credit cards. ' 
          ]}) 
df 
फिर

:

df['blobs'].str.extractall(r'\d{2}(—|-)(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d{2,4}') 

r'\d{2}(—|-)(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d{2,4}' 

तो मैं यह इस प्रकार का परीक्षण किया:

Two numbers (from 01 to 12) hyphen tree letters (a valid month) hyphen two numbers, for example: 08-Jan—07 or 03-Oct—01

मैं निम्नलिखित regex का उपयोग करने की कोशिश की फिर भी, वे काम नहीं कर रहे हैं। पिछले regex मुझे कुछ भी नहीं देता है (यानी सिर्फ - hypens):

Col 
0 NaN 
1 - 
2 - 
3 NaN 
4 NaN 
5 - 
... 
n - 

कैसे मैं उन्हें क्रम में ठीक कर सकते हैं ?:

  Col 
0 6-Feb-14, 17-Feb-2014 
1 29—Oct-2012, 18-Oct-12 

अद्यतन प्राप्त करने के लिए

मैंने यह भी करने की कोशिश की:

import re 
df['col'] = df.blobs.apply(lambda x: re.findall('\d{2}(—|-)(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d{2,4}',x)) 
s = df.apply(lambda x: pd.Series(x['col']),axis=1).stack().reset_index(level=1, drop=True) 
s.name = "col" 
df = df.drop('col') 
df 

फिर भी मैं भी मिल गया:

ValueError        Traceback (most recent call last) 
<ipython-input-4-5e9a34bd159f> in <module>() 
     3 s = df.apply(lambda x: pd.Series(x['col']),axis=1).stack().reset_index(level=1, drop=True) 
     4 s.name = "col" 
----> 5 df = df.drop('col') 
     6 df 

/usr/local/lib/python3.5/site-packages/pandas/core/generic.py in drop(self, labels, axis, level, inplace, errors) 
    1905     new_axis = axis.drop(labels, level=level, errors=errors) 
    1906    else: 
-> 1907     new_axis = axis.drop(labels, errors=errors) 
    1908    dropped = self.reindex(**{axis_name: new_axis}) 
    1909    try: 

/usr/local/lib/python3.5/site-packages/pandas/indexes/base.py in drop(self, labels, errors) 
    3260    if errors != 'ignore': 
    3261     raise ValueError('labels %s not contained in axis' % 
-> 3262         labels[mask]) 
    3263    indexer = indexer[~mask] 
    3264   return self.delete(indexer) 

ValueError: labels ['col'] not contained in axis 
+1

':' गलत वर्तनी, सही है (?)? 'आर "\ b \ d {2} - (?: जनवरी | फरवरी | मार्च | अप्रैल | मई | जून | जुलाई | अगस्त | सितंबर | अक्टूबर | नवंबर | दिसंबर) - \ d {2} \ b" '। यदि एन-या-डैश हो सकते हैं, तो '---- '' --- ---' के साथ बदलें। –

+2

एक नज़र में, आपके regexes हाइफ़न से मेल नहीं खाते हैं। – Kevin

+1

यदि आप '6-Feb' स्वीकार करना चाहते हैं, तो आपको दो की बजाय _one_ संख्या अपफ्रंट की अनुमति देनी होगी। जैसे '\ d {1,2}' – khelwood

उत्तर

1

जब आप Series.str.extract या Series.str.extractall उपयोग करते हैं, पर कब्जा कर लिया सबस्ट्रिंग पूरे मैच, लौटा दिया जाता है नहीं। इसलिए, आपको यह सुनिश्चित करने की ज़रूरत है कि आप कैप्चर करने के लिए आवश्यक पैटर्न का हिस्सा (यानी ( और )) जोड़ें।

अब, अपनी पंक्तियों में कई उम्मीद मैचों इसे और अधिक मुश्किल extractall से कोई लेना देना बनाना, ऐसा लगता है आप Series.str.findallपूरे मेल खाता अगर कोई कैप्चरिंग समूह पैटर्न में परिभाषित किया गया है वापस आ सकते हैं कि उपयोग कर सकते हैं।

उपयोग

rx = r'\b\d{1,2}[-–—](?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[-–—](?:\d{4}|\d{2})\b' 
df['Col'] = df['blobs'].str.findall(rx).apply(','.join) 

.apply(','.join)Col कॉलम में अल्पविराम से अलग तार करने के लिए सूचियों में परिवर्तित कर देंगे।

पैटर्न का अर्थ है:

  • \b - एक शब्द सीमा
  • \d{1,2} - 1 या 2 अंकीय
  • [-–—] - एक हाइफन, em- या एन-पानी का छींटा
  • (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) - में से किसी 12 महीने के छोटे नाम
  • [-–—] - एक हाइफ़न, एम-एन-डैश
  • (?:\d{4}|\d{2}) - 4 या 2 अंक
  • \b - एक शब्द सीमा
+0

धन्यवाद, बस एक और त्वरित प्रश्न ... ऊपरी और निचले मिलान के मामले में '(? I) '? जोड़ना ठीक है? उदाहरण के लिए: आर '\ बी \ डी {1,2} [---] ((? i) ?: जनवरी | फरवरी | मार्च | अप्रैल | मई | जून | जुलाई | अगस्त | सितंबर | अक्टूबर | नवंबर | दिसंबर) [---] (?: \ D {4} | \ d {2}) \ b ' –

+1

पायथन * 're' * में, इनलाइन' (? I) 'संशोधक की जगह कोई फर्क नहीं पड़ता है। यदि आप इसे अंत में रखते हैं, तो यह * पूरे * पैटर्न केस असंवेदनशील बना देगा। 'आरएक्स = आर' (? I) \ b \ d {1,2} [---] (?: जनवरी | फरवरी | मार्च | अप्रैल | मई | जून | जुलाई | अगस्त | सितंबर | अक्टूबर | नवंबर | दिसंबर) [---] (?: \ D {4} | \ d {2}) \ b'' –

+1

धन्यवाद आपका उत्तर वास्तव में extractall मुद्दे को स्पष्ट करने में मेरी सहायता करता है –

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