我有一个包含如下字符串的文件:
"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}})因为我很想理解正则表达式。
答案 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)