Python t、 那么,我希望有人告诉我。这将有助于我进行更改(过去也是如此)。这将匹配空字符串,而原始实现不接受空字符串。@Darth Android:谢谢;更改。如果应用程序需要一个格式良好的字符串,并且他将该字符串拆分为所需的块,并注意到该字符串无效,则引发异常

Python t、 那么,我希望有人告诉我。这将有助于我进行更改(过去也是如此)。这将匹配空字符串,而原始实现不接受空字符串。@Darth Android:谢谢;更改。如果应用程序需要一个格式良好的字符串,并且他将该字符串拆分为所需的块,并注意到该字符串无效,则引发异常,python,regex,exception-handling,error-handling,Python,Regex,Exception Handling,Error Handling,t、 那么,我希望有人告诉我。这将有助于我进行更改(过去也是如此)。这将匹配空字符串,而原始实现不接受空字符串。@Darth Android:谢谢;更改。如果应用程序需要一个格式良好的字符串,并且他将该字符串拆分为所需的块,并注意到该字符串无效,则引发异常是最合适的做法。@poke:我同意,我只希望明确说明这一点。。。我猜任何错误,甚至自定义的错误都可能会被引发。上次我检查时,python没有G标志,所以你不会得到单独的匹配。哇,真的吗?你们是怎么处理的?不过有一个findall()函数。sub


t、 那么,我希望有人告诉我。这将有助于我进行更改(过去也是如此)。这将匹配空字符串,而原始实现不接受空字符串。@Darth Android:谢谢;更改。如果应用程序需要一个格式良好的字符串,并且他将该字符串拆分为所需的块,并注意到该字符串无效,则引发异常是最合适的做法。@poke:我同意,我只希望明确说明这一点。。。我猜任何错误,甚至自定义的错误都可能会被引发。上次我检查时,python没有G标志,所以你不会得到单独的匹配。哇,真的吗?你们是怎么处理的?不过有一个findall()函数。sub()总是被认为是全局的。通常它不会引起任何问题。findall()是/g的一个很好的替代品,如果有一个包含换行符的文本块,您可能还需要使用修饰符re.MULTILINE和/或re.DOTALL。第一个正则表达式:为什么从
^
开始?为什么以
$
而不是
\Z
结尾?第二个
*
不应该是
+
?(1)Python也支持不情愿的量词,(2)这两个正则表达式不等价,(3)它们都是错误的<代码>[a-z]??最多匹配一个字母(OP称最多可以有两个字母);虽然
[0-9]?[0-9]?
最多匹配两位数字(OP没有对这些数字进行任何限制)。(1)我对Python一无所知。(2)这些regexp在.net Framework中是等效的,因为[a-z]??相当于[a-z]?[a-z]?在.net Framework sow中,a和z(3)之间需要0到2个字符,关于数字替换[0-9]的无限量??使用[0-9]*“?”匹配前一个元素零次或一次,但次数尽可能少。“因此,您完全错了,额外的“?”后缀会将匹配切换到适度(非贪婪)模式。
C6H5Fe2I   # this string should be matched successfully. Result: C6 H5 Fe2 I
H2TeO4     # this string should be matched successfully Result: H2 Te O4
H3PoooO5   # exception should be raised
C2tH6      # exception should be raised
^([A-Z][a-z]{0,2})(\d*)$
>>> re.match(r'(([A-Z][a-z]{,2})(\d*))+$', 'H2TeO4')
<_sre.SRE_Match object at 0x920f520>
>>> re.match(r'(([A-Z][a-z]{,2})(\d*))+$', 'H3PoooO5')
>>> 
>>> res = re.findall(r'([A-Z][a-z]{,2})(\d*)(?=(?:[A-Z][a-z]{,2}\d*|$))', s)
>>> res
[('C', '6'), ('H', '5'), ('Fe', '2'), ('I', '')]
>>> ''.join(''.join(i) for i in res) == s
True
^([A-Z][a-z]{0,2}\d*)*$
[A-Z][^A-Z]*
/^([A-Z][a-z]{0,2}\d*)+$/
(([A-Z][a-z]{0,2})(\d*))+
>>> import re
>>> reMatch = re.compile( '([A-Z][a-z]{0,2})(\d*)' )
>>> def matchText ( text ):
        matches, i = [], 0
        for m in reMatch.finditer( text ):
            if m.start() > i:
                break
            matches.append( m )
            i = m.end()
        else:
            if i == len( text ):
                return matches
        raise ValueError( 'invalid text' )

>>> matchText( 'C6H5Fe2I' )
[<_sre.SRE_Match object at 0x021E2800>, <_sre.SRE_Match object at 0x021E28D8>, <_sre.SRE_Match object at 0x021E2920>, <_sre.SRE_Match object at 0x021E2968>]
>>> matchText( 'H2TeO4' )
[<_sre.SRE_Match object at 0x021E2890>, <_sre.SRE_Match object at 0x021E29F8>, <_sre.SRE_Match object at 0x021E2A40>]
>>> matchText( 'H3PoooO5' )
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    matchText( 'H3PoooO5' )
  File "<pyshell#3>", line 11, in matchText
    raise ValueError( 'invalid text' )
ValueError: invalid text
>>> matchText( 'C2tH6' )
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    matchText( 'C2tH6' )
  File "<pyshell#3>", line 11, in matchText
    raise ValueError( 'invalid text' )
ValueError: invalid text
([A-Z][a-b]??[0-9]??)*
([A-Z][a-b]?[a-b]?[0-9]?[0-9]?)*
tests= (
'C6H5Fe2I',   # this string should be matched successfully. Result: C6 H5 Fe2 I
'H2TeO4',     # this string should be matched successfully Result: H2 Te O4
'H3PoooO5',   # exception should be raised
'C2tH6')      # exception should be raised

def splitter(case):
    case, original = list(case), case
    while case:
        if case[0].isupper():
            result = case.pop(0)
        else:
            raise ValueError('%r is not capital letter in %s position %i.' %
                             (case[0], original, len(original)-len(case)))
        for count in range(2):
            if case and case[0].islower():
                result += case.pop(0)
            else:
                break
        for count in range(2):
            if case and case[0].isdigit():
                result += case.pop(0)
            else:
                break
        yield result

for testcase in tests:
    try:
        print tuple(splitter(testcase))
    except ValueError as e:
        print(e)
>>> tests= (
... 'C6H5Fe2I',
... 'H2TeO4',
... 'H3PoooO5',
... 'C2tH6',
... 'Bad\n')
>>> import re
>>> pattern = r'([A-Z][a-z]{0,2}\d*)'
>>> for test in tests:
...     pieces = re.split(pattern, test)
...     print "\ntest=%r pieces=%r" % (test, pieces)
...     data = pieces[1::2]
...     rubbish = filter(None, pieces[0::2])
...     print "rubbish=%r data=%r" % (rubbish, data)
...

test='C6H5Fe2I' pieces=['', 'C6', '', 'H5', '', 'Fe2', '', 'I', '']
rubbish=[] data=['C6', 'H5', 'Fe2', 'I']

test='H2TeO4' pieces=['', 'H2', '', 'Te', '', 'O4', '']
rubbish=[] data=['H2', 'Te', 'O4']

test='H3PoooO5' pieces=['', 'H3', '', 'Poo', 'o', 'O5', '']
rubbish=['o'] data=['H3', 'Poo', 'O5']

test='C2tH6' pieces=['', 'C2', 't', 'H6', '']
rubbish=['t'] data=['C2', 'H6']

test='Bad\n' pieces=['', 'Bad', '\n']
rubbish=['\n'] data=['Bad']
>>>
import re

pattern = r'([A-Z][a-z]{0,2})(\d*)'

input_text = "C6H5Fe2I" # Some input text
output = re.sub(pattern, '', input_text)

if output == '':
    print("[INFO] COMPLETE MATCH!")
    print("[FINDINGS]", re.findall(pattern, input_text))
else:
    print("[INFO] NOT A COMPLETE MATCH.")