Python не может найти это сгруппированное имя

1

Я пытаюсь дать совет по формату справочной литературы. Например, для академической диссертации формат:

author. dissertation name[D]. place where store it: organization who hold the copy, year in which the dissertation published.

очевидно, что в каждой позиции может быть какая-то пунктуация, кроме года. например

Smith. The paper name. The subtitle of paper[D]. United States: MIT, 2011

часто, place where store it и year пропущены, например

Smith. The paper name. The subtitle of paper[D]. US, 2011
Smith. The paper name. The subtitle of paper[D]. US: MIT

Я хочу запрограммировать так:

import re
reObj = re.compile(
r'.*\[D\]\.  \s*  ((?P<PLACE>[^:]*):){0,1} \s*   (?P<HOLDER>[^:]*)   (?P<YEAR>,\s*(1|2)\d{3}){0,1}',
re.VERBOSE
)

txt = '''Smith. The paper name. The subtitle of paper[D]. US: MIT, 2011
Smith. The paper name. The subtitle of paper[D]. US, 2011
Smith. The paper name. The subtitle of paper[D]. US: MIT'''.split('\n')

for i in txt:
    if reObj.search(i):
        if reObj.search(i).group('PLACE')==None:
            print('missing place')

        if reObj.search(i).group('YEAR')==None:
            print('missing year')
    else:
        print('bad formation')

но я обнаружил, что ни один YEAR не получил для я в txt: print (i) print (reObj.search(i).group("HOLDER"))

выходы

Smith. The paper name. The subtitle of paper[D]. US: MIT, 2011
MIT, 2011
Smith. The paper name. The subtitle of paper[D]. US, 2011
US, 2011
Smith. The paper name. The subtitle of paper[D]. US: MIT
MIT

for i in txt:
    print(i)
    print(reObj.search(i).group('YEAR'))

выходы

Smith. The paper name. The subtitle of paper[D]. US: MIT, 2011
None
Smith. The paper name. The subtitle of paper[D]. US, 2011
None
Smith. The paper name. The subtitle of paper[D]. US: MIT
None

Итак, почему моя названная группа терпит неудачу и как ее исправить? Спасибо

Теги:
named

1 ответ

1
Лучший ответ

Мне кажется, вы можете использовать

reObj = re.compile("""
    \[D\]\.  \s*            # [D]. and 0+ whitespaces
    (?:                     # An  optional alternation group
     (?P<PLACE>[^,:]*)      # Group "PLACE": 0+ chars other than , and :
       (?:                           # An optional sequence of
          : \s* (?P<HOLDER>[^,:]*)   # :, 0+ whitespaces, Group "HOLDER" (0+ non-colons and non-commas)
        )?
        (?:                          # An optional sequence of
          ,\s* (?P<YEAR>[12]\d{3})   # , + 0+ whitespaces, Group "YEAR" (1 or 2 and then three digits
        )?                       
    )?      
    $          # end of string
    """, flags=re.X)

См. Примеры регулярных выражений и Python:

import re
reObj = re.compile(
    r"\[D\]\.\s*(?:(?P<PLACE>[^,:]*)(?::\s*(?P<HOLDER>[^,:]*))?(?:,\s*(?P<YEAR>[12]\d{3}))?)?$",
    re.VERBOSE
)
txt = '''Smith. The paper name. The subtitle of paper[D]. US: MIT, 2011
Smith. The paper name. The subtitle of paper[D]. US, 2011
Smith. The paper name. The subtitle of paper[D]. US: MIT'''.split('\n')

for i in txt:
    print('------------------------\nTESTING {}'.format(i))
    m = reObj.search(i)
    if m:
        if not m.group('PLACE'):
            print('missing place')
        else:
            print(m.group('PLACE'))

    if not m.group('YEAR'):
        print('missing year')
    else:
        print(m.group('YEAR'))

Выход:

------------------------
TESTING Smith. The paper name. The subtitle of paper[D]. US: MIT, 2011
US
2011
------------------------
TESTING Smith. The paper name. The subtitle of paper[D]. US, 2011
US
2011
------------------------
TESTING Smith. The paper name. The subtitle of paper[D]. US: MIT
US
missing year
  • 0
    Еще один вопрос, что если ДЕРЖАТЕЛЬ может использовать любой символ и пунктуацию. Другими словами, строка HOLDER расширяется до тех пор, пока не встретит YEAR, и если YEAR произойдет, это должен быть последний элемент. Итак, Smith. The paper name. The subtitle of paper[D]. US: MIT, Dep 1, 2011 возвращает MIT, Dep 1 качестве ДЕРЖАТЕЛЯ и Smith. The paper name. The subtitle of paper[D]. US: MIT, building 1998, 2011 возвращает MIT, building 1998 как ДЕРЖАТЕЛЬ. В обоих случаях 2011 год читается как ГОД
  • 0
    Я пытался использовать .* Для ДЕРЖАТЕЛЯ, но, очевидно, это неправильно. И поскольку английский не является моим родным языком, я не могу найти жаргон для этого поведения
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню