我正在努力制定一个正则表达式,从列表中提取所有物种名称(group1)和作者名称(group2)。我对python相当陌生,希望得到任何帮助。
这是清单的一部分:
[医]金合欢
达尔贝贾·阿达米·贝哈特
[医]黄芩G.Don
J.Linares & M. Sousa
[医][医]& Dalziel
[医]。
Dalbergia amazonica (Radlk.)杜克
[医]金龟子( Dalbergia amerimmon . ex B.D.Jacks )
[中英文摘要]中华白头翁& R.Rabev.
[医]柴胡
[医]柴胡
[医] E.Mey.
[医][医]马尾草
[医]紫荆,博塞尔& R.Rabev.
[医]巴罗尼达尔贝贝克尔
[医][医] R.Vig.
[医]水曲柳
[医]黄柏
[医]达尔贝吉伪科学。
[医]鹅掌楸属。[医]梭特。
[医]白僵菌亚种白粉菌群
通常种名有一个属和一个种名,有些有亚种名称。我可以用:
([A-Z][a-z]*[\s]{1}[a-z]*|[A-Z][a-z]*[\s]{1}[a-z]*[\s]{1}[a-z]*)
我不会因为"-“而发现一些例外,比如"Dalbergia because sissoo”。我不知道如何处理变种“var”。或以"subsp.“表示亚种的情况。
我不能想出一个正则表达式来处理作者的复杂结构。他们总是以大写字母或"(“)开头。
有些条目没有作者,我仍然希望物种条目被退回。
到目前为止,这是我的尝试,但没有得到我想要的一切:
([A-Z][a-z]*[\s]{1}[a-z]*|[A-Z][a-z]*[\s]{1}[a-z]*[\s]{1}[a-z]*)\s([A-Z][a-z]*|[(][A-Z][a-z]*|[\0])
它确实与任何一个属的名称相匹配,如果之前的行没有作者的名字。
提前感谢您的帮助!
发布于 2021-03-04 13:10:14
这应该可以做到:
^(?P<species>[A-Z][^A-Z(]+)(?P<author>(?<!^).*)$
^
--断言行的开始(?P<species>[A-Z][^A-Z(]+)
命名的捕获组“物种”必须以一个大写字母开头,然后获取所有东西,而不是大写或括号。(?P<author>(?<!^).*)
命名的捕获组"author“不能在行开始时捕获到行尾之前的所有内容。$
--行尾断言发布于 2021-03-04 13:11:14
那么像^([A-Z][^A-Z(]+)([(A-Z].+)?$
这样的正则表达式呢?
import re
data = """Dalbergia acutifoliolata Mendonca & Sousa
Dalbergia adami Berhaut
Dalbergia afzeliana G.Don
Dalbergia agudeloi J.Linares & M. Sousa
Dalbergia albiflora Hutch. & Dalziel
Dalbergia altissima Baker f.
Dalbergia amazonica (Radlk.) Ducke
Dalbergia amerimmon L. ex B.D.Jacks
Dalbergia andapensis Bosser & R.Rabev.
Dalbergia arbutifolia Baker
Dalbergia arbutifolia aberrans Polhill
Dalbergia armata E.Mey.
Dalbergia assamica Benth.
Dalbergia aurea Bosser & R.Rabev.
Dalbergia baronii Baker
Dalbergia bathiei R.Vig.
Dalbergia benthamii
Dalbergia berteroi
Dalbergia pseudo-sissoo Miq.
Dalbergia ovata var. glomeriflora (Kurz) Thoth.
Dalbergia albiflora subsp. albiflora"""
pattern = re.compile(r"^([A-Z][^A-Z(]+)([(A-Z].+)?$")
for entry in data.splitlines():
matcher = pattern.match(entry)
print("Name: {0:50} Author: {1}".format(*matcher.groups()))
输出
Name: Dalbergia acutifoliolata Author: Mendonca & Sousa
Name: Dalbergia adami Author: Berhaut
Name: Dalbergia afzeliana Author: G.Don
Name: Dalbergia agudeloi Author: J.Linares & M. Sousa
Name: Dalbergia albiflora Author: Hutch. & Dalziel
Name: Dalbergia altissima Author: Baker f.
Name: Dalbergia amazonica Author: (Radlk.) Ducke
Name: Dalbergia amerimmon Author: L. ex B.D.Jacks
Name: Dalbergia andapensis Author: Bosser & R.Rabev.
Name: Dalbergia arbutifolia Author: Baker
Name: Dalbergia arbutifolia aberrans Author: Polhill
Name: Dalbergia armata Author: E.Mey.
Name: Dalbergia assamica Author: Benth.
Name: Dalbergia aurea Author: Bosser & R.Rabev.
Name: Dalbergia baronii Author: Baker
Name: Dalbergia bathiei Author: R.Vig.
Name: Dalbergia benthamii Author: None
Name: Dalbergia berteroi Author: None
Name: Dalbergia pseudo-sissoo Author: Miq.
Name: Dalbergia ovata var. glomeriflora Author: (Kurz) Thoth.
Name: Dalbergia albiflora subsp. albiflora Author: None
发布于 2021-03-04 13:34:07
你可以试试这个:
(^\w+.*?)(?:([A-Z(].*)|$)
(^\w+.*?)
在作者姓名第一次出现或没有出现之前捕获单词/字符(可以以大写字母或左圆括号开头)。(?:([A-Z(].*)|$)
捕获以大写字母或圆括号开头的作者名称(如果存在),如果它是字符串的结尾,则为“其他匹配”https://stackoverflow.com/questions/66475350
复制相似问题