मेरे पास विसंगति पैटर्न खोजने के लिए यह नियमित अभिव्यक्ति कोड है।

if not re.match(r'(-?[01]\.[0-9]{1,8})\s(-?[01]\.[0-9]{1,8})', text):
    print("anomaly!!")

मैं कुछ ऐसा खोजना चाहता हूं जो if not के माध्यम से विसंगति पैटर्न।

मेरा कोड आमतौर पर अच्छा काम करता है, लेकिन मुझे एक ऐसा मामला मिला जहां काम नहीं करता है:

0.00000000e+00 // It should be error (included non-numeric strings)
0.000000  // It should be error (complete zero cannot exist)
0.00  0000  // It should be error (included non-numeric strings)

मैंने निम्नलिखित नियमों का पालन किया:

1. The value after the decimal point can be from at least one letter to at maximum eight.
2. Never include non-numeric strings.
3. A complete zero (0.0 ~0.00000000) cannot exist.
4. A value must exist after the decimal point.

मुझे लगता है, मेरी नियमित अभिव्यक्ति पूर्ण शून्य (0.0 से 0.00000000) और गैर-संख्यात्मक मानों का पता नहीं लगा सकती है।

मैं अपनी नियमित अभिव्यक्ति में दो अपवाद कैसे लागू कर सकता हूं?

कृपया मुझे कुछ सुझाव दें।

यह मेरा परीक्षण मामला है:

[-0.19666128 -0.0000]  # It should be error (complete zero cannot exist)
[-1.09666128 -0.16812956]  # It should be correct.
[-0.180045 -0.22017317]  # It should be correct.
[1.00000786 -0.24855652]  # It should be correct.
[0.1766060 -1.]  # It should be error (A value must exist after the decimal point)
[1.16797414 0.00000000e+00]  # It should be error (included non-numeric strings)
[-0. 0.]  # It should be error (A value must exist after the decimal point)
[1.1223297 -0.2840327]  # It should be correct.
[1. -0.       ]  # It should be error (A value must exist after the decimal point and included non-numeric strings)
[-0.11070672 -0.20553467]  # It should be correct.
[1.04924586 -0.16772696]  # It should be correct.
[0.06169098 -0.15855075]  # It should be correct.
[-0.11988816 1.20512903]  # It should be correct.
[-0.180045   -1.22017317]  # It should be correct.
[-0.18486786 -0.24855652]  # It should be correct.
1
freshcodeman 18 अप्रैल 2021, 14:30

2 जवाब

सबसे बढ़िया उत्तर

आपको re.search (के बाद से) का उपयोग करने और निम्नलिखित रेगेक्स का उपयोग करने की आवश्यकता है:

\[(-?(?!0(?:\.0+)?\s)[01](?:\.[0-9]{1,8})?)\s+(-?(?!0(?:\.0+)?])[01](?:\.[0-9]{1,8})?)]

रेगेक्स डेमो देखें।

(?!0(?:\.0+)?\s) और (?!0(?:\.0+)?]) लुकहेड मैच को रद्द कर देंगे यदि दोनों में से कोई भी संख्या शून्य है।

पायथन डेमो देखें:

import re
n = r'[01](?:\.[0-9]{1,8})?' # Number matching part declared as a variable
rx = re.compile(fr"\[(-?(?!0(?:\.0+)?{n}\s))\s+(-?(?!0(?:\.0+)?]){n})]")
test_strs = ["[-0.19666128 -0.0000]","[-1.09666128 -0.16812956]","[-0.180045 -0.22017317]", "[1.00000786 -0.24855652]", "[0.1766060 -1.]", "[1.16797414 0.00000000e+00]",
"[-0. 0.]", "[1.1223297 -0.2840327]","[1. -0.       ]", "[-0.11070672 -0.20553467]","[1.04924586 -0.16772696]"
"[0.06169098 -0.15855075]","[-0.11988816 1.20512903]","[-0.180045   -1.22017317]","[-0.18486786 -0.24855652]"]
for text in test_strs:
    if rx.search(text):
        print(f'{text}: Valid')
    else:
        print(f'{text}: Invalid')

आउटपुट:

[-0.19666128 -0.0000]: Invalid
[-1.09666128 -0.16812956]: Valid
[-0.180045 -0.22017317]: Valid
[1.00000786 -0.24855652]: Valid
[0.1766060 -1.]: Invalid
[1.16797414 0.00000000e+00]: Invalid
[-0. 0.]: Invalid
[1.1223297 -0.2840327]: Valid
[1. -0.       ]: Invalid
[-0.11070672 -0.20553467]: Valid
[1.04924586 -0.16772696][0.06169098 -0.15855075]: Valid
[-0.11988816 1.20512903]: Valid
[-0.180045   -1.22017317]: Valid
[-0.18486786 -0.24855652]: Valid
1
Wiktor Stribiżew 18 अप्रैल 2021, 14:57

पैटर्न के अंत में एक $ वर्ण जोड़ें। अन्यथा re.match() फ़ंक्शन पैटर्न से शुरू होने वाली किसी भी स्ट्रिंग को स्वीकार करेगा।

उदाहरण:

print(re.match(r'a', 'abc'))
print(re.match(r'a$', 'abc'))

नतीजा:

   <re.Match object; span=(0, 1), match='a'>
   None

आपके मामले में:

>>> print(re.match(r'(-?[01]\.[0-9]{1,8})\s(-?[01]\.[0-9]{1,8})$', '1.16797414 0.00000000e+00'))
None
>>> print(re.match(r'(-?[01]\.[0-9]{1,8})\s(-?[01]\.[0-9]{1,8})', '1.16797414 0.00000000e+00'))
<re.Match object; span=(0, 21), match='1.16797414 0.00000000'>

(यह "सटीक शून्य" मामले को फ़िल्टर नहीं करेगा। आपको या तो अंत में एक गैर-शून्य अंक को बाध्य करने की आवश्यकता होगी जैसे [0-9]{0,7}[1-9] (ध्यान दें कि यह 0.0000 लेकिन 0.50000 को भी फ़िल्टर करेगा), या आपको इसकी आवश्यकता होगी बाद में मिलान संख्या के मूल्य की जाँच करें।)

2
Christoph Burschka 18 अप्रैल 2021, 14:42