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


113

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

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


编辑:

我努力了:

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

不过,它似乎不起作用。


2
你尝试了什么?-你找不到re.split()吗?
加雷斯·拉蒂

5
当您说某事不起作用时,您应该解释原因。你有例外吗?(如果是这样,请发布整个异常)您是否得到了错误的输出?
加雷斯·拉蒂

Answers:


134

我建议

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

检查这个演示


5
不使用compile时会发生什么?
Feelsbadman

3
根据文档,“ 大多数正则表达式操作都可以作为模块级函数和RegexObject方法使用。这些函数是快捷方式,不需要您首先编译regex对象,但是会错过一些微调参数。 ”您可以使用re.split(re.split(pattern, string, maxsplit=0, flags=0))如先前引用的文档中所述。
ZaydH

57

您可以先行使用:

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

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

请注意,方括号仅出于可读性考虑,也可以省略。

如果一个单词的第一个字母大写就足够了(因此,如果您也想在其前面拆分Hello),它将变得更加容易:

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

现在,这会在每个空格处分开,后跟任何大写字母。


1
我将如何更改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)应该这样做。
Martin Ender 2012年

2
我建议至少[ ]+或什\W+至可以抓到更多案件。仍然是一个很好的答案。
georg

我尝试了相同的方法。但是,拥有一个[ ]对我没有用。相反,我使用\s。对我re.split("\s(?=[A-Z]+\s)", string)
有用

0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.