重复?正则表达式模式解析Textus Receptus诗歌

时间:2014-04-24 13:35:11

标签: python regex

我正在尝试解决此正则表达式问题:

import re

letters = "αΑβΒγΓδΔεΕϛϚϜϝζΖηΗθΘιΙυϒYκΚϡϠͲͳλΛωΩμΜτΤνΝξΞοΟσΣϹϲςπΠχΧϙϘϞϟρΡψΨφΦ"
c = '([%s]+) ([^\s]+) ([^\s%s]+)' % (letters, letters)

regex_word_strong_morph = re.compile(c)

verse = "βιβλος G976 G976 N-NSF γενεσεως G1078 N-GSF ιησου G2424 N-GSM χριστου G5547 N-GSM υιου G5207 N-GSM δαβιδ G1138 N-PRI υιου G5207 N-GSM αβρααμ G11 N-PRI"

regex_word_strong_morph.findall(verse)

输出:

[('βιβλος', 'G976', 'G976'),
 ('γενεσεως', 'G1078', 'N-GSF'),
 ('ιησου', 'G2424', 'N-GSM'),
 ('χριστου', 'G5547', 'N-GSM'),
 ('υιου', 'G5207', 'N-GSM'),
 ('δαβιδ', 'G1138', 'N-PRI'),
 ('υιου', 'G5207', 'N-GSM'),
 ('αβρααμ', 'G11', 'N-PRI')]

但第一项应该是:

('βιβλος', 'G976', 'G976', 'N-NSF')

我quess([^ \ s] +)应该是这样的:([^ \ s] +){1,2}但是它不太正确。如果只匹配三个项目,则可以在第四个索引上设置空单元格,例如:

('γενεσεως', 'G1078', 'N-GSF', '')

2 个答案:

答案 0 :(得分:1)

您可以尝试:(请注意,我已选择将可能的空字段放在第三个位置)

#!/usr/bin/python
# -*- coding: utf-8 -*-
import re

pattern = u'([Ͱ-ϡ]+) ([A-Z0-9-]+)(?: ([A-Z0-9-]+))? ([A-Z0-9-]+)(?=\\s|$)'

regex_word_strong_morph = re.compile(pattern)

verse = u"βιβλος G976 G976 N-NSF γενεσεως G1078 N-GSF ιησου G2424 N-GSM χριστου G5547 N-GSM υιου G5207 N-GSM δαβιδ G1138 N-PRI υιου G5207 N-GSM αβρααμ G11 N-PRI"

print regex_word_strong_morph.findall(verse)

答案 1 :(得分:0)

试试这个:

>>> import re
>>> c = '([αΑβΒγΓδΔεΕϛϚϜϝζΖηΗθΘιΙυϒYκΚϡϠͲͳλΛωΩμΜτΤνΝξΞοΟσΣϹϲςπΠχΧϙϘϞϟρΡψΨφΦ]+.*?.-.{3})'
>>> regex_word_strong_morph = re.compile(c)
>>> verse = "βιβλος G976 G976 N-NSF γενεσεως G1078 N-GSF ιησου G2424 N-GSM χριστου G5547 N-GSM υιου G5207 N-GSM δαβιδ G1138 N-PRI υιου G5207 N-GSM αβρααμ G11 N-PRI"

正则表达式:

([αΑβΒγΓδΔεΕϛϚϜϝζΖηΗθΘιΙυϒYκΚϡϠͲͳλΛωΩμΜτΤνΝξΞοΟσΣϹϲςπΠχΧϙϘϞϟρΡψΨφΦ]+.*?.-.{3})

演示:http://regex101.com/r/oL3bX1