【问题标题】:How do I find the separator of elements in a string?如何找到字符串中元素的分隔符?
【发布时间】:2013-11-03 01:37:14
【问题描述】:

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

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

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

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

【问题讨论】:

  • hello world; goodbye world 中的分隔符是什么?
  • 字符串中除了分隔符还有非字母数字字符吗?
  • " 分隔符仅存在于两个元素之间" 这不是很有帮助的信息。字符串中的元素很难 介于 多于 2 个或少于 2 个。你的问题不合适。
  • @Jon 应该是 "; "
  • @Discipol:未问的问题是:你怎么知道?为什么不只是; 或只是一个空格? hello world;goodbye world 呢?是; 还是这里的空格?再说一遍,你怎么知道?

标签: regex string algorithm


【解决方案1】:

找到分隔符

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

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

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

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

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

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

【讨论】:

  • 并不是所有可能的输入,只有最常见的用户会输入。给用户一个“错误的输入”错误就像说“你在电脑上很烂”,需要这个来处理这些事情。用户很可能会使用 , 或 ;或“;”或“,”
【解决方案2】:

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

可能不是这样,所以我的解决方案是:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 2019-09-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多