लिब्रे ऑफिस Calc में नियमित अभिव्यक्ति के नाम समूह को निकालना


2

पायथन 3 में, नामित समूहों से पाठ निकालना काफी आसान है जैसा कि निम्नलिखित उदाहरण में दिखाया गया है:

import re
myStr = r"4000/2000/5000/7000"
reObj = re.compile(r"""(?P<g1>\d+)  # a capturing group named g1
                       /
                       (?P<g2>\d+)
                       /
                       (?P<g3>\d+)
                       /
                       (?P<g4>\d+)""", re.VERBOSE) 
matchObj = reObj.match(myStr)  # match the string to be searched
print(matchObj.group("g1"))  # 4000
print(matchObj.group("g2"))  # 2000 
print(matchObj.group("g3"))  # 5000 
print(matchObj.group("g4"))  # 7000

हालाँकि, LibreOffice Calc में मुझे कोई सुराग नहीं मिल सकता है (Calc के पास एक स्वतंत्र regex () फ़ंक्शन भी नहीं है जो एक regex पैटर्न देता है)। इस पोस्ट में स्थिति-आधारित वर्कअराउंड नहीं है जो मुझे चाहिए।

कृपया संभावित PARAMETERS के प्रतिनिधियों को प्रस्तुत करें और कृपया पूरी तरह से जाँच करें। जैसे कि MID () स्वीकार्य नहीं है। हालांकि यहां दिया गया उदाहरण काफी सरल है, लेकिन मुझे वास्तविक स्थिति से निपटने के लिए एक सामान्य तरीके की आवश्यकता है जो कहीं अधिक जटिल है।

जवाबों:


6

एक्सेल और कैल्क दोनों में, सबसे साफ समाधान एक सामान्य-उद्देश्य नियमित अभिव्यक्ति मैक्रो बनाना है। Calc में ऐसा करने के लिए, Tools -> Macros -> Organize Macros -> LibreOffice Basicनिम्नलिखित पर जाएं और Module1 में निम्न कोड जोड़ें:

Function ReFind(findIn, patt, Optional group_param As Integer,  _
                Optional ignoreCase_param As Boolean)
    ' findIn - string or cell to search in
    ' patt - regexp string or cell containing regexp string
    ' group - which group to grab - analogy to \n in regexp syntax
    ' ignoreCase - false for case sensitive matches
    If IsMissing (group_param) Then
        group = 0
    Else
        group = group_param
    End If
    If IsMissing (ignoreCase_param) Then
        ignoreCase = False
    Else
        ignoreCase = ignoreCase_param
    End If
    oTextSearch = CreateUnoService("com.sun.star.util.TextSearch")
    oOptions = CreateUnoStruct("com.sun.star.util.SearchOptions")
    oOptions.algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP
    If ignoreCase Then
        oOptions.transliterateFlags = _
            com.sun.star.i18n.TransliterationModules.IGNORE_CASE
    End If
    oOptions.searchString = patt
    oTextSearch.setOptions(oOptions)
    oFound = oTextSearch.searchForward(findIn, 0, Len(findIn))
    If oFound.subRegExpressions = 0 Then
        ReFind = "No results"
        MsgBox "No results"
        Exit Function
    ElseIf group >= oFound.subRegExpressions Then 
         ReFind = "No result for that group"
         MsgBox "No result for that group"
         Exit Function
    Else
         nStart = oFound.startOffset()
         nEnd = oFound.endOffset()
         ReFind = Mid(findIn, nStart(group) + 1, nEnd(group) - nStart(group))
    End If
End Function

अब आप ReFindस्प्रैडशीट में आवश्यक किसी भी नियमित अभिव्यक्ति के लिए उपयोग कर सकते हैं । उदाहरण के लिए, सेल A1 में दर्ज करें 12345। सेल बी 1 में, सूत्र दर्ज करें =REFIND($A$1,"(\d\d)(\d)",2)। यह तीसरे नंबर को पुनः प्राप्त करेगा, जो कि 3 है।

कोड https://forum.openoffice.org/en/forum/viewtopic.php?t=30502 से अनुकूलित किया गया था ।

नोट: एड-इन का उपयोग करके अजगर या जावा में नियमित अभिव्यक्ति बनाना बेहतर होगा । हालाँकि इसके लिए एक्सएमएल डिक्लेरेशन फ़ाइलों की आवश्यकता होती है, जिसे सेट करने में अधिक समय लगता है।


आकर्षण जैसा काम करता है। १००+ प्रतिनिधि बताता है। (यह उत्तर एक सामान्य समाधान के साथ-साथ एक सीधे लागू उदाहरण देता है।)
cbhuang

अच्छा! +1 - अब, अभी भी 90+ प्रतिनिधि के लायक है ;-)
tohuwawohu

1

AFAIK आप LO Calc Search / रिप्लेसमेंट या फॉर्मूले में नामित समूहों का उपयोग नहीं कर सकते हैं, लेकिन आप पैटर्न समूहों के लिए संख्यात्मक संदर्भ का उपयोग कर सकते हैं :

  • में खोज क्षेत्र, आप उपयोग कर सकते \1पहले पैटर्न समूह को संदर्भित करने, \2दूसरे और इतने पर के लिए।
  • में बदलने के अभिव्यक्ति, का उपयोग $1, पहले खोज पैटर्न समूह के लिए संदर्भ के रूप में $2दूसरे और इतने पर के लिए।

खोज उदाहरण

चार तार मान लिया जाये कि blue bluefish, black blackfish, blue blackfishऔर black bluefish, आप हर स्ट्रिंग जहां एक ही रंग में दो बार प्रकट होता है (तार 1 और 2) खोज पद्धति का उपयोग कर जगह ले सकता है: (blue|black) \1fish\1मिलान समूह का संदर्भ दे देंगे, पूरी स्ट्रिंग मिलान रंग regex समूह में मिलान केवल तभी (blue|black)पहले दिखाई देने वाला fishभी। ( OOo विकी डॉक्यूमेंटेशन पर आधारित उदाहरण )।

उदाहरण बदलें

स्ट्रिंग को बदलने के 100/200/300/400लिए 300/100/400/200(खोज विकल्पों में सक्षम रेगेक्स के साथ), पैटर्न की खोज करें (\d+)/(\d+)/(\d+)/(\d+)और उसके साथ बदलें $3/$1/$4/$2


1
बहुत करीब है, लेकिन क्या आप (सीधे लागू रूप में) अनुकरण कर सकते हैं? मैं =SEARCH(A5, "(\d+)/(\d+)/(\d+)/(\d+)",1)सेल A5 युक्त पर कोशिश की, 100/200/300/400लेकिन मिल गया #VALUE! मैं लिबरऑफिस के लिए नया हूं। आपके द्वारा दिया गया अनुभाग सामान्य तर्क का पता लगाने के लिए मेरे लिए पर्याप्त नहीं था। आपका बहुत बहुत धन्यवाद।
cbhuang

खोज पैटर्न में पहला तर्क होना चाहिए, दूसरा नहीं। तो, कोशिश करें=SEARCH("(\d+)/(\d+)/(\d+)/(\d+)",A5,1)
tohuwawohu

उपरोक्त देता है 1। नहीं 100=SEARCH("(\d+)/(\d+)/(\d+)/(\d+)",A5,\1)या =SEARCH("(\d+)/(\d+)/(\d+)/(\d+)",A5,'\1') भी काम नहीं किया। डॉलर का चिह्न भी विफल रहा। (लिब्रे ऑफिस 5.0.5.2 @ win10 x64)
cbhuang

हां, परिणाम सही है। SEARCH()समारोह मैच की स्थिति को देता है। चूंकि आप पूरी स्ट्रिंग का मिलान कर रहे हैं, शुरुआत में 1, परिणाम स्ट्रिंग की शुरुआत है। तीसरा तर्क वैकल्पिक है, एक स्ट्रिंग के बीच में खोज शुरू करने के लिए एक ऑफसेट जोड़ना। यह एक प्रतिस्थापन सेट नहीं करता है। खोज () सिर्फ स्थिति के लिए जाँच करता है लेकिन कुछ भी प्रतिस्थापित नहीं करता है।
तोहवोहोहू

तो अपने सेल को B5देने 100, C5देने 200, D5देने 300और E5देने के लिए मुझे क्या कोड लिखना चाहिए 400?? क्या आप कृपया विस्तार से बताएं (और अपनी पोस्ट में संपादित करें)? यह स्पष्ट रूप से मैच की शुरुआत खोजने के लिए पर्याप्त नहीं है।
cbhuang
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.