如何在字符串中找到元素的分隔符?

时间:2013-10-24 11:13:02

标签: regex string algorithm

我有一个字符串,例如“option1; option2; option3”,其中“;”分隔符可能是任何东西用户放置的至少1个字符的任何字符串。

我正在寻找一种简单/干净的方法来确定分隔符,而不包含输入字符串以外的任何信息。

我可以保证分隔符仅存在于2个元素之间,但考虑输入字符串中只有一个选项的可能性。我还可以保证分隔符只是非字母数字,可能包含空格和$或#或%等。

无法为此创建正则表达式,但也许有人能够,但我并不是特别寻找正则表达式。

2 个答案:

答案 0 :(得分:2)

找到分隔符

in = "option1;option2;option3"
separator=re.search("[ ;'#/.,<>?~@;,:}{\]\[+=\-_]+", in).group()

很抱歉,使用正则表达式更容易

现在它又回到你身边了。你需要证明这是有效的,因为你打算反对所有可能的输入

这是一个可能更容易使用的版本

possible=""" ;'#/.,<>?~@,:}{][+=-_"""
seperator=re.search("[%s]+" % re.escape(possible), input).group()

这意味着可以更容易地添加或删除regexp中具有特殊含义的字符

答案 1 :(得分:1)

只有在您确定只有字符[A-Za-z0-9_]出现在inf字段中时,才会有效: ^(\w+)\W(\w+)\W(\w+)$

情况可能并非如此,所以我的解决方案是:

  1. 创建所有可能分隔符的列表。
  2. 对于每个分隔符运行一个正则表达式(在循环中动态构造):^([^X]+)X([^X]+)X([^X]+)$其中X是分隔符。
  3. 检查匹配数是否等于预期的列数(如果您不知道列数,则转到4.)
  4. 为每一行运行它以查看匹配数是否发生变化,因为第一行中的匹配可能是一个盲目的运气。
  5. 如果它在任何地方都匹配,那么你有你的分隔符和列数。如果它不匹配,则开始检查每一行的下一个分隔符。
  6. 此解决方案的缺点是,在最坏的情况下,您将为每行文本和每个分隔符运行正则表达式。 可能的优化是:

    1. 首先使用最常见的分隔符开始检查
    2. 不要为每个分隔符的每一行运行正则表达式,只需计算整个文本中分隔符的数量。如果行数除以没有余数的分隔符数,那么分隔符很有可能是有效的。