首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用正则表达式查找物种名称和作者名称

使用正则表达式查找物种名称和作者名称
EN

Stack Overflow用户
提问于 2021-03-04 12:48:28
回答 3查看 317关注 0票数 1

我正在努力制定一个正则表达式,从列表中提取所有物种名称(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.

[医]水曲柳

[医]黄柏

[医]达尔贝吉伪科学。

[医]鹅掌楸属。[医]梭特。

[医]白僵菌亚种白粉菌群

通常种名有一个属和一个种名,有些有亚种名称。我可以用:

代码语言:javascript
运行
复制
([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.“表示亚种的情况。

我不能想出一个正则表达式来处理作者的复杂结构。他们总是以大写字母或"(“)开头。

有些条目没有作者,我仍然希望物种条目被退回。

到目前为止,这是我的尝试,但没有得到我想要的一切:

代码语言:javascript
运行
复制
([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])

它确实与任何一个属的名称相匹配,如果之前的行没有作者的名字。

提前感谢您的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-04 13:10:14

这应该可以做到:

代码语言:javascript
运行
复制
^(?P<species>[A-Z][^A-Z(]+)(?P<author>(?<!^).*)$
  • ^ --断言行的开始
  • (?P<species>[A-Z][^A-Z(]+)命名的捕获组“物种”必须以一个大写字母开头,然后获取所有东西,而不是大写或括号。
  • (?P<author>(?<!^).*)命名的捕获组"author“不能在行开始时捕获到行尾之前的所有内容。
  • $ --行尾断言

https://regex101.com/r/wzDSXE/1/

票数 4
EN

Stack Overflow用户

发布于 2021-03-04 13:11:14

那么像^([A-Z][^A-Z(]+)([(A-Z].+)?$这样的正则表达式呢?

代码语言:javascript
运行
复制
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()))

输出

代码语言:javascript
运行
复制
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
票数 3
EN

Stack Overflow用户

发布于 2021-03-04 13:34:07

你可以试试这个:

代码语言:javascript
运行
复制
(^\w+.*?)(?:([A-Z(].*)|$)
  1. (^\w+.*?) 在作者姓名第一次出现或没有出现之前捕获单词/字符(可以以大写字母或左圆括号开头)。
  2. (?:([A-Z(].*)|$) 捕获以大写字母或圆括号开头的作者名称(如果存在),如果它是字符串的结尾,则为“其他匹配”

Regex Demo

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66475350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档