在python中拆分字符串时如何考虑特殊字符

在python中拆分字符串时如何考虑特殊字符,python,split,Python,Split,我有几个字符串的形式是“[一个或多个单词][数字][一个或多个单词]”,我想把它们分成两个字符串和数字。例如,如果字符串为: "A sample string 20 something" 我想获得: str1 = "A sample string" numb = 20 str2 = 'something' 我已经(几乎)通过以下代码实现了我的目标: for s in row.split(): if s.isdigit(): qu

我有几个字符串的形式是“[一个或多个单词][数字][一个或多个单词]”,我想把它们分成两个字符串和数字。例如,如果字符串为:

"A sample string 20 something"
我想获得:

str1 = "A sample string"
numb = 20
str2 = 'something'
我已经(几乎)通过以下代码实现了我的目标:

for s in row.split():
    if s.isdigit():
        quants = s
temp = row.split("{}".format(quants))
str1 = temp[0].strip()
str2 = temp[1].strip()
这在大多数情况下都适用。但是,有两个例外我无法处理:

  • 如果数字在括号内,我希望它被算作一个字符串。例如:

    “一些文本(如1个示例)再添加2个单词”

    我想要str1=“一些文本(如1个示例所示)”

  • 有时数字以特殊字符(Unicode?、¼、½和¾表示。我如何解释这些

  • 我怀疑答案是使用正则表达式而不是分隔符,但我还不能真正掌握如何使用它们。

    我通过用数字替换正则表达式来调整答案

    import re
    l = re.compile("((?<=\d)(?=\D)|(?=\d)(?<=\D))(?![^\(]*\))").split(test)
    
    此处测试:


    其中,
    (?您可以使用带有3个捕获组的正则表达式,然后获取组的值

    ^(\w+(?: \w+)*(?: \([^()]*\))?) (\d+|[¼½¾]) (\w+(?: \w+)*)$
    
    解释

    • ^
      字符串的开头
    • Capturegroup 1
      • \w+(?:\w+*
        匹配1+个单词字符,可以选择按空格和1+个单词字符重复
      • (?:\([^()]*\)?
        可以选择匹配一个空格并形成从开始到结束的括号
    • 关闭组并匹配空格
    • (\d+|[¼½¾])
      Capture第2组匹配所列
      ¼½¾和空格中的1+位或1
    • (\w+(?:\w+*)
      Capture第3组匹配1+个单词字符,并可以选择重复前面加空格的字符
    • $
      字符串结尾
    |

    示例代码

    输出

    Some text (just as 1 example)
    ¼
    more words
    

    一种更广泛的模式,使用
    *
    匹配除换行符以外的任何字符,而不是使用
    \w+

    ^(.*(?:\([^()]*\))?) (\d+|[¼½¾]) (.+)
    

    一些注释:1)<代码> SPLITE()/代码>不会帮助你;你的解决方案只适用于单位数2),因为在文本中需要不同的方法,所以需要考虑括号内的数字。3) 有了正确的编码语句,您可以像在问题中一样在代码中包含分数。1)实际上,我的解决方案也适用于超过1位的数字,只要它们之间没有空格,这就满足了我必须处理的字符串的特征。2) 什么方法?3) 你所说的编码语句是什么意思?这些不仅仅是分数,而是unicode(?)字符(即¼不是1/4)对不起,我编辑了我的答案,以更好地满足您的需要,除了特殊字符,您是指
    ½=1/2?请您解释一下好吗?我的代码已经可以这样分解字符串了。这段代码能处理我上面提到的两个异常吗?太好了!此外,regex演示工具也非常棒。非常感谢你!
    
    Some text (just as 1 example)
    ¼
    more words
    
    ^(.*(?:\([^()]*\))?) (\d+|[¼½¾]) (.+)