基于正则表达式拆分字符串

Posted

技术标签:

【中文标题】基于正则表达式拆分字符串【英文标题】:Split string based on regex 【发布时间】:2012-10-23 22:36:17 【问题描述】:

用大写单词(在 Python 中)分割像 "HELLO there HOW are YOU" 这样的字符串的最佳方法是什么?

所以我最终会得到一个这样的数组:results = ['HELLO there', 'HOW are', 'YOU']


编辑:

我试过了:

p = re.compile("\b[A-Z]2,\b")
print p.split(page_text)

但它似乎不起作用。

【问题讨论】:

What have you tried? - 找不到re.split() 当你说某事不起作用时,你应该解释原因。你有例外吗? (如果是这样,发布整个异常)你得到错误的输出吗? 【参考方案1】:

您可以使用前瞻:

re.split(r'[ ](?=[A-Z]+\b)', input)

这将在每个空格处拆分,后跟一串以单词边界结尾的大写字母。

请注意,方括号只是为了便于阅读,也可以省略。

如果单词的第一个字母是大写就足够了(所以如果你也想在Hello 前面拆分),那就更容易了:

re.split(r'[ ](?=[A-Z])', input)

现在它在每个空格处拆分,后跟任何大写字母。

【讨论】:

如何更改re.split(r'[ ](?=[A-Z]+\b)', input) 使其找不到大写字母?例如。它不会匹配“A”?我试过re.split(r'[ ](?=[A-Z]2,+\b)', input)。谢谢! @JamesEggers 你的意思是你希望至少需要两个大写字母,这样你就不会在I 这样的词处分裂? re.split(r'[ ](?=[A-Z]2,\b)', input) 应该这样做。 我建议至少[ ]+ 甚至\W+ 来捕获更多的案例。不过,一个很好的答案。 我尝试了同样的方法。但是,拥有[ ] 对我不起作用。相反,我使用了\s。对我有用的完整正则表达式是re.split("\s(?=[A-Z]+\s)", string)【参考方案2】:

我建议

l = re.compile("(?<!^)\s+(?=[A-Z])(?!.\s)").split(s)

检查this demo

【讨论】:

不使用 compile 会发生什么? 根据re docs,“大多数正则表达式操作都可用作模块级函数和 RegexObject 方法。这些函数是不需要您先编译正则表达式对象的快捷方式,但错过了一些微调参数。" 您可以使用前面引用的文档中提到的re.split(re.split(pattern, string, maxsplit=0, flags=0))【参考方案3】:

您的问题包含字符串文字"\b[A-Z]2,\b", 但是 \b 将意味着退格,因为没有 r 修饰符。

试试:r"\b[A-Z]2,\b"

【讨论】:

以上是关于基于正则表达式拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式基于空格引号和括号进行拆分

Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列数据并添加到原数据中replace函数基于正则表达式替换字符串数据列中的匹配内容

C# 正则表达式拆分为 Java 模式拆分

通过正则表达式拆分字符串[重复]

Java如何拆分正则表达式和字符串?

如何使用正则表达式拆分字符串而不消耗拆分器部分?