首页 > 解决方案 > 在python中拆分字符串时如何考虑特殊字符

问题描述

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

"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. 如果数字在括号内,我希望它被计为一个字符串。例如:

    “一些文字(仅作为 1 个示例)还有 2 个单词”

    我想要 str1 =“一些文本(仅作为 1 个示例)”

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

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

标签: pythonsplit

解决方案


您可以使用带有 3 个捕获组的正则表达式,然后获取这些组的值。

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

解释

  • ^字符串的开始
  • (捕获组 1
    • \w+(?: \w+)*匹配 1+ 个单词字符,可选择按空格和 1+ 个单词字符重复
    • (?: \([^()]*\))?可选地匹配空格并形成左括号直到右括号
  • ) 关闭组并匹配空间
  • (\d+|[¼½¾]) 捕获组 2匹配 1+ 个数字或 1 个列出的¼½¾和空格
  • (\w+(?: \w+)*)捕获组 3匹配 1+ 个单词字符,并可选择重复前面的空格
  • $字符串结束

正则表达式演示| Python 演示

示例代码

import re

regex = r"(\w+(?: \w+)*(?: \([^()]*\))?) (\d+|[¼½¾]) (\w+(?: \w+)*)"
s = "Some text (just as 1 example) ¼ more words"
match = re.match(regex, s)
if match:
    print(match.group(1))
    print(match.group(2))
    print(match.group(3))

输出

Some text (just as 1 example)
¼
more words

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

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

正则表达式演示


推荐阅读