在“先生”之前拆分字符串或“太太”

时间:2015-04-07 10:24:54

标签: python regex split

我有一个包含如下字符串的文件:

"TextMr. XxxxxMrs. YyyyyMrs. ZzzzzTextWordLady ZzzzzMr. Xxxxx"

现在,我想用Python拆分它,看起来像这样:

['Text', 'Mr. Xxxxx', 'Mrs. Yyyyy', 'Mrs. Zzzzz', 'Text', 'Word', 'Lady Zzzzz', 'Mr. Xxxxx']

目前我正在使用以下内容:

test2 = re.sub( r"([A-Z])", r" \1", data).split()

给了我:

['Text', 'Mr.', 'Xxxxx', 'Mrs.', 'Yyyyy', 'Mrs.', 'Zzzzz', 'Text', 'Word', 'Lady', 'Zzzzz', 'Mr.', 'Xxxxx']

我知道它可能非常简单,并且还阅读了我能找到的有关正则表达式和标题的所有主题,但似乎没有人遇到同样的问题。如果有人可以指出我正确的方向并且告诉我出错了什么,我会很高兴(有一次,我花了一个小时盯着一段代码片段,但却发现我只是忘了{{ 1}})因为我很想理解正则表达式。

2 个答案:

答案 0 :(得分:2)

我建议您创建一个列表,其中包含所有可能首先出现的名称:

>>> titles = "Mr\. Mrs\. Lady Sir".split()
['Mr\\.', 'Mrs\\.', 'Lady', 'Sir']

然后,您可以使用它们为任何标题创建正则表达式,后跟空格。

>>> title_opt = "(?:(?:" + "|".join(titles) + ") )?"
'(?:(?:Mr\\.|Mrs\\.|Lady|Sir) )?'

然后使用这些标题后跟一个单词来查找所有名称和单词。

>>> re.findall(title_opt + "[A-Z][a-z]+", text)
['Text', 'Mr. Xxxxx', 'Mrs. Yyyyy', 'Mrs. Zzzzz', 'Text', 'Word', 'Lady Zzzzz', 'Mr. Xxxxx']

或者,基于您自己的方法,一旦获得了名称,单词和标题列表,就可以使用迭代器将标题连接到迭代器中的next单词。

>>> names = ['Text', 'Mr.', 'Xxxxx', 'Mrs.', 'Yyyyy', 'Mrs.', 'Zzzzz', 'Text', 'Word', 'Lady', 'Zzzzz', 'Mr.', 'Xxxxx']
>>> titles = set("Mr. Mrs. Lady Sir".split())
>>> iterator = iter(names)
>>> [s if s not in titles else s + " " + next(iterator) for s in iterator]
['Text', 'Mr. Xxxxx', 'Mrs. Yyyyy', 'Mrs. Zzzzz', 'Text', 'Word', 'Lady Zzzzz', 'Mr. Xxxxx']

答案 1 :(得分:1)

(.+?)(?=Mr\.|Mrs\.|$|(?<! )[A-Z])

试试这个。看看demo.Grab捕获。

https://regex101.com/r/sJ9gM7/59#python

import re
p = re.compile(r'(.+?)(?=Mr\.|Mrs\.|$|(?<! )[A-Z])', re.MULTILINE)
test_str = "TextMr. XxxxxMrs. YyyyyMrs. ZzzzzTextWordLady ZzzzzMr. Xxxxx"

re.findall(p, test_str)