(追記)コメント欄で以下よりシンプルな書き方を教えていただきました。
モチベーション
生物の学名は斜体で書くという決まりがあります。Wordに文章を打ち込んでいる時に、いちいち学名を手作業で斜体にするのが面倒なので、自動化したいです。そのための第一歩としてPythonで学名を抜き出してみます。
ちなみにPython 学名で検索するとニシキヘビ(Python)の情報が出てきます。
学名を抜き出す
日本語文の中に半角英字で学名が書かれていることを想定。例文はWikipediaの「クラミドモナス」より取りました。
text = "クラミドモナス(Chlamydomonas)は緑藻綱クラミドモナス目(もしくはオオヒゲマワリ目)に属する単細胞の鞭毛虫からなる属である。"\
"500種以上が知られているが、単にクラミドモナスと言えば、モデル生物として盛んに利用されている"\
"コナミドリムシ(Chlamydomonas reinhardtii)を指すことが多い。"\
"C. reinhardtii は分子生物学、特に鞭毛の運動や葉緑体の動力学、発生生物学、遺伝学の研究のモデル生物である。"\
"チャンネルロドプシンのような、光感受性のイオンチャネルを持っていることは、クラミドモナスの特筆すべき性質の一つである。"\
"「ウォーターメロン・スノー」として知られる、雪山がピンク色(あるいは赤色)に染まる現象は、同属の C. nivalis のしわざである。"
文章の中に出てくる学名には3パターンあります(上の文章はすべてのパターンを網羅しています)。
- 属名のみ 例:Chlamydomonas
- 属名+種小名 例:Chlamydomonas reinhardtii
- 属名の頭文字+種小名 例:C. reinhardtii
属名の頭文字は大文字、種小名はすべて小文字です。
英語など、ラテンアルファベットで記述される言語の文章から学名を抜き出すのはそれなりに面倒そうですが、日本語文からなら正規表現で半角英字を探せばできそうです(まさか全角で学名を書く生物学者はいないでしょう)。ということで、やりました。正規表現弱者なので、もっとエレガントな書き方があるよという人は教えてください。
import re
result = re.findall(r"[A-Z][a-z]+ [a-z]+|[A-Z][a-z]+|[A-Z]\. [a-z]+", text)
print(result)
とりあえず全部抜き出せたようです。
正規表現の|(OR)前後の順番を変えるとうまくいきませんでした。
result = re.findall(r" A | B | C ", text)
となっている時に、A, B, Cの順番で探すものと思われます。
上のコードでは、「属名+種小名|属名のみ|属名の頭文字+種小名」の順番で探しています。「属名のみ|属名+種小名|属名の頭文字+種小名」とすると、「属名+種小名」がうまく探せませんでした。