【问题标题】:Special regex for String in pythonpython中字符串的特殊正则表达式
【发布时间】:2018-05-22 08:58:55
【问题描述】:

我有一个像下面这样的字符串。

s = ({[test1, test2 ; test3 (New) ]})

现在我有一个正则表达式,它将删除括号并将其转换为列表。即使有用a;b,c隔开之类的。 正则表达式:

output = [i for i in re.split(r'\s*[(){}<>\[\],;\'"]\s*', s) if i]

但是这个正则表达式也会从列表中的项目中删除括号。 ((新) 就我而言)

如何将此正则表达式应用于字符串的开头和结尾。我知道可以使用^ 完成,但不确定如何?

预期输出

['test1', 'test2', 'test3 (New)' ]

来自上述正则表达式的输出

['test1', 'test2', 'test3', '新']

有什么帮助吗?

【问题讨论】:

  • 你的预期输出是什么?
  • 更新了我的问题
  • 将括号添加到列表元素是一个选项吗? (New) 元素是否总是列表中的最后一个?
  • 不,我的意思是在我的字符串的任何元素中都可能有 (New) 这样的东西。我只想从字符串的开头和结尾删除括号
  • @JayeshDhandha,这个字符串-[({[test1, test2(3) ; test3 (New) ]})]-的结果应该是什么?

标签: python regex string


【解决方案1】:
s = '({[test1, test2 ; test3 (New) ]})'

根据您在下面的评论,我假设整个字符串的左括号数等于右括号数。

所以去掉外括号首先需要知道它们的编号:

m = re.match('[({[]*', s)
n_brckt = m.span()[1] - m.span()[0]

然后删除外括号( - 取决于是否找到任何...):

if n_brckt > 0:
    s = s[n_brckt:-n_brckt]
s = s.strip()

In: s
Out: 'test1, test2 ; test3 (New)'

然后,您可以在所有出现的逗号或冒号处拆分,可选地后跟空格:

In: re.split('[,;]+ *', s)
Out: ['test1', 'test2', 'test3 (New)']

【讨论】:

  • 我不能使用strip,因为字符串的开头和结尾可能有不同数量的括号。我不能使用string with 3 count
  • 那么如何字符串的开头和结尾是什么样子的呢?这个要说清楚,不然就是猜谜游戏……
  • 它不修复。有时它只有[{( ,有时只有[{。在字符串的末尾也是一样的。
  • 您错过了 1 件事。如果我的字符串不包含任何括号,那么您的输出将是 [''] 这是不正确的。
  • 你想告诉我,字符串甚至可能根本没有外括号...?
【解决方案2】:

使用re.search

import re
s = "({[test1, test2 ; test3 (New) ]})"
m = re.search("\[(.*?)\]", s)
if m:
    #print(m.group(1).replace(";", ",").split(",")) 
    print([i.strip() for i in m.group(1).replace(";", ",").split(",")])

输出:

['test1', 'test2', 'test3 (New)']

【讨论】:

  • 好答案。谢谢!
  • 检查(({{[[test1, test2 ; test3 (France)]]}}))的输出
  • 对于深层嵌套结构,正则表达式将不起作用,并可能导致不必要的问题。最好根据您的需要找到一个解析器。例如:stackoverflow.com/questions/5454322/…
  • 请注意if m: 不是re.match 成功的有效测试。你可以使用if m.end():,但是,清楚地写if m.end() &gt; 0:或类似的东西总是更容易阅读和理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 2023-03-31
相关资源
最近更新 更多