0

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

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

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

无法为此创建正则表达式,但也许有人可以,尽管我并不是特别在寻找正则表达式。

4

2 回答 2

2

找到分隔符

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

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

现在它还给你了。您需要证明这对所有可能的输入都有效

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

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

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

于 2013-10-24T12:58:52.460 回答
1

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

这可能不是这种情况,所以我的解决方案是:

  1. 创建所有可能的分隔符的列表。
  2. 对于这些分隔符中的每一个,运行一个正则表达式(在循环中动态构造):^([^X]+)X([^X]+)X([^X]+)$whereX是分隔符。
  3. 检查匹配数是否等于预期的列数(或转到 4。如果您不知道列数)。
  4. 对每一行运行它以查看匹配数是否发生变化,因为第一行中的匹配可能是盲目的运气。
  5. 如果它在任何地方都匹配,那么您就有了分隔符和列数。如果不匹配,则开始检查每一行的下一个分隔符。

这个解决方案的缺点是,在最坏的情况下,您会为每一行文本和每个分隔符运行正则表达式。可能的优化是:

  1. 首先开始检查最常见的分隔符
  2. 而不是为每个分隔符的每一行运行正则表达式,只需计算整个文本中分隔符的数量。如果行数除以分隔符字符数而没有余数,则分隔符很可能有效。
于 2013-10-24T13:13:31.577 回答