python - 在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 个示例)还有 2 个单词”
我想要 str1 =“一些文本(仅作为 1 个示例)”
有时数字以特殊字符(Unicode?)、¼、½ 和 ¾ 表示。我该如何解释这些?
我怀疑答案是使用正则表达式而不是分隔符,但我还不能真正掌握如何使用它们。
解决方案
您可以使用带有 3 个捕获组的正则表达式,然后获取这些组的值。
^(\w+(?: \w+)*(?: \([^()]*\))?) (\d+|[¼½¾]) (\w+(?: \w+)*)$
解释
^
字符串的开始(
捕获组 1\w+(?: \w+)*
匹配 1+ 个单词字符,可选择按空格和 1+ 个单词字符重复(?: \([^()]*\))?
可选地匹配空格并形成左括号直到右括号
)
关闭组并匹配空间(\d+|[¼½¾])
捕获组 2匹配 1+ 个数字或 1 个列出的¼½¾
和空格(\w+(?: \w+)*)
捕获组 3匹配 1+ 个单词字符,并可选择重复前面的空格$
字符串结束
示例代码
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+|[¼½¾]) (.+)
推荐阅读
- angular - 如何在角度使用resteasy正确发送文件?
- swift - Swift 4 - 垂直 UICollectionView 上的 UIRefreshControl 滞后
- c++ - Visual Studio 2008 c++ 可执行文件(调试和发布)不起作用
- android - 在 Recyclerview 顶部添加视图
- python - 放入循环时如何更新 datetime.now 函数
- ios - iOS - 如何使用 tesseract OCR 将文本识别为块
- maven - 具有自动配置的自定义 Micronaut 模块/jar
- javascript - ReactJS更改状态错误的数组项:无法分配给对象的只读属性
- java - wsdl2java 不会生成所有存根 java
- mysql - 使用许多左连接简化 MySQL 查询