Python re.match не находит символы в середине строки - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть список ссылок на веб-сайты, которые точно такие же, за исключением меняющегося года, который я пытаюсь найти.Я использую re.match, чтобы попытаться найти его, поскольку строка точно такая же, за исключением 4 символов (20xx).По какой-то причине он только возвращает None, и я не знаю почему.

Я пытался использовать другие методы re, такие как findall и fullmatch, но это не помогает.

state_links = ["https://2009-2017.state.gov/r/pa/prs/ps/2009/index.htm",
               "https://2009-2017.state.gov/r/pa/prs/ps/2010/index.htm",
               "https://2009-2017.state.gov/r/pa/prs/ps/2011/index.htm",
               "https://2009-2017.state.gov/r/pa/prs/ps/2012/index.htm",
               "https://2009-2017.state.gov/r/pa/prs/ps/2013/index.htm",
               "https://2009-2017.state.gov/r/pa/prs/ps/2014/index.htm",
               "https://2009-2017.state.gov/r/pa/prs/ps/2015/index.htm",
               "https://2009-2017.state.gov/r/pa/prs/ps/2016/index.htm"]

for link in state_links:
   year = re.match(r"https://2009-2017.state.gov/r/pa/prs/ps/(.*)/index.htm", link)

   print(year)

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Ваш пример, как показано, работает, печатая серию re.Match экземпляров. (Хотя . не делает то, что вы думаете, он делает, и может быть разумнее использовать \d{4} внутри группы захвата. Простой . - это шаблон для любого символа; вам, вероятно, нужен буквальный период , \..)

Несмотря на это, если ваши ссылки всегда имеют такой чистый формат, вы также можете использовать метод str здесь:

>>> [int(i.rsplit("/", 2)[-2]) for i in state_links]
[2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016]

Это разбивает каждую ссылку на 3 части, где каждый промежуточный элемент будет выглядеть так:

>>> state_links[0].rsplit("/", 2)
['https://2009-2017.state.gov/r/pa/prs/ps', '2009', 'index.htm']

Затем индексатор [-2] берет компонент года.

0 голосов
/ 10 апреля 2019

как указано @Drubio, ваш шаблон регулярных выражений правильный.Тем не менее, проверьте свой код.Следующие работы:

regex = r"https://2009-2017.state.gov/r/pa/prs/ps/(\d{4})/index.htm"
years = re.finditer(regex, state_links, re.MULTILINE)
for year in years:    
    for j in range(0, len(year.groups())):
        j  += 1       
        print ("{year}".format(year = year.group(j))) 

Output
## 2009 2010 2011 2012 2013 2014 2015 2016  

Кредит @Brad для \d{4} предложение / исправление, а также .split опция

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...