繁体   English   中英

用逗号拆分字符串,除非在括号中,除非在逗号之前和/或之后直接是破折号“-”?

[英]Split a string by comma except when in bracket and except when directly before and/or after the comma is a dash "-"?

只是想弄清楚如何用逗号分隔字符串,除非在括号中,除非在逗号之前和/或之后是破折号。 对于如何处理括号问题,我已经找到了一些很好的解决方案,但我不知道如何将其扩展到我的问题。

这是一个例子:

example_string = 'A-la-carte-Küche, Garnieren (Speisen, Getränke), Kosten-, Leistungsrechnung, Berufsausbildung, -fortbildung'
aim = ['A-la-carte-Küche', 'Garnieren (Speisen, Getränke)', 'Kosten-, Leistungsrechnung', 'Berufsausbildung, -fortbildung']

到目前为止,我已经设法做到了以下几点:

>>> re.split(r',\s*(?![^()]*\))', example_string)
>>> out: ['A-la-carte-Küche', 'Garnieren (Speisen, Getränke)', 'Kosten-', 'Leistungsrechnung', 'Berufsausbildung', '-fortbildung']

请注意术语“Kosten-, Leistungsrechnung”和“Berufsausbildung, -fortbildung”的目标和出局之间的区别。 如果有人可以帮助我,使 output 看起来像目标,我会很高兴。

提前致谢!
亚历克斯

如果你可以使用 python regex module ,你可以这样做:

\([^()]*\)(*SKIP)(*F)|(?<!-)\s*,\s*(?!,)

模式匹配:

  • \([^()]*\)从左括号到右括号匹配
  • (*SKIP)(*F)跳过比赛
  • | 或者
  • (?<,-)\s*?\s*(,!,)匹配要拆分的可选空白字符之间的逗号

正则表达式演示

import regex

example_string = 'A-la-carte-Küche, Garnieren (Speisen, Getränke), Kosten-, Leistungsrechnung, Berufsausbildung, -fortbildung'
print(regex.split(r"\([^()]*\)(*SKIP)(*F)|(?<!-)\s*,\s*(?!,)", example_string))

Output

['A-la-carte-Küche', ' Garnieren (Speisen, Getränke)', ' Kosten-, Leistungsrechnung', ' Berufsausbildung', ' -fortbildung']

您可以使用

re.split(r'(?<!-),(?!\s*-)\s*(?![^()]*\))', example_string)

请参阅Python 演示 详情

  • (?<!-) - 如果当前位置的左侧紧邻有一个-字符,则匹配失败的否定后视
  • , - 一个逗号
  • (?!\s*-) - 如果当前位置的右侧立即有一个-字符,则匹配失败的否定前瞻
  • \s* - 零个或多个空格
  • (?![^()]*\)) - 如果除了)(然后是)字符之外还有零个或多个字符,则匹配失败的否定前瞻性紧接在当前位置的右侧。

也请参阅正则表达式演示

暂无
暂无

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

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