繁体   English   中英

Python正则表达式分为几个字符,除非后跟括号

[英]Python regex split into characters except if followed by parentheses

我有一个字符串,如"F(230,24)F[f(22)_(23);(2)%[+(45)FF]]" ,其中每个字符除了括号和它们所包含的内容代表一种教学。 字符后面可以跟随可选括号中指定的可选参数列表。

这样的字符串我想将字符串分成['F(230,24)', 'F', '[', 'f(22)', '_(23)', ';(2)', '%', '[', '+(45)', 'F', 'F', ']', ']'] ,但此刻我只得到['F(230,24)', 'F', '[', 'f(22)_(23);(2)', '%', '[', '+(45)', 'F', 'F', ']', ']'] (子串未正确拆分)。

目前我正在使用list(filter(None, re.split(r'([A-Za-z\\[\\]\\+\\-\\^\\&\\\\\\/%_;~](?!\\())', string))) ,它只是一堆乱七八糟的字符和( .list list(filter(None, <list>))用于从结果中删除空字符串。

我知道这可能是因为Python的re.split被设计为不分割为零长度匹配, 如此 re.split 讨论的 但是我想知道什么是一个好的解决方案? 有没有比re.findall更好的方法?

谢谢。

编辑:不幸的是我不允许使用像regex模块的自定义包

我知道这可能是因为Python的re.split被设计为不分割为零长度匹配

您可以使用regex模块VERSION1标志。 从您链接的线程中获取该示例 - 请参阅split()如何生成零宽度匹配:

>>> import regex as re
>>> re.split(r"\s+|\b", "Split along words, preserve punctuation!", flags=re.V1)
['', 'Split', 'along', 'words', ',', 'preserve', 'punctuation', '!']

您可以使用re.findall查找所有单个字符,可选地后跟一对括号:

import re
s = "F(230,24)F[f(22)_(23);(2)%[+(45)FF]]"
re.findall("[^()](?:\([^()]*\))?", s)

['F(230,24)',
 'F',
 '[',
 'f(22)',
 '_(23)',
 ';(2)',
 '%',
 '[',
 '+(45)',
 'F',
 'F',
 ']',
 ']']
  • [^()]匹配除括号外的单个字符;
  • (?:\\([^()]*\\))? 表示由一对括号括起来的非捕获组( ?: :)并使用? 使小组成为可选的;

另一种方法。 这次模式识别具有SYMBOL [(NUMBER [,NUMBER ...])]结构的字符串。 如果字符串与正则表达式匹配,则函数parse_it返回True和标记,如果不匹配,则返回False和空。

import re
def parse_it(string):
    '''
    Input: String to parse
    Output: True|False, Tokens|empty_string
    '''
    pattern = re.compile('[A-Za-z\[\]\+\-\^\&\\\/%_;~](?:\(\d+(?:,\d+)*\))?')
    tokens = pattern.findall(string)
    if ''.join(tokens) == string:
        res = (True, tokens)
    else:
        res = (False, '')
    return res

good_string = 'F(230,24)F[f(22)_(23);(2)%[+(45)FF]]'
bad_string = 'F(2a30,24)F[f(22)_(23);(2)%[+(45)FF]]' # There is an 'a' in a bad place.

print(parse_it(good_string))
print(parse_it(bad_string))

输出:

(是的,['F(230,24)','F','[','f(22)','_(23)',';(2)','%','[', '+(45)','F','F',']',']'])
(假,'')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM