Почему это регулярное выражение возвращает пустой список? - PullRequest
0 голосов
/ 05 августа 2020

Здесь новый программист .. Я пытаюсь получить все хэштеги и ссылки из строки. Регулярные выражения сами по себе возвращают желаемый результат; однако при их объединении возвращается пустой список. Как это исправить?

import re

tweet = ('New PyBites article: Module of the Week - Requests-cache '
     'for Repeated API Calls - http://pybit.es/requests-cache.html '
     '#python #APIs')


# Get all hashtags and links from tweet
def get_hashtags_and_links(tweet=tweet):
tweet_regex = re.compile(r'''(
                         \(#\w+\)
                         \(https://[^\s]+\)
                         )''', re.VERBOSE)

tweet_object = tweet_regex.findall(tweet)
print(tweet_object)

get_hashtags_and_links()

Ответы [ 3 ]

2 голосов
/ 05 августа 2020

вы ищете #\w+ (заключено в буквальные скобки), сразу за которым следует https://[^\s]+ (также заключено в буквальные круглые скобки), который не появляется там, где в вашем тексте

вместо этого используйте | или полосу

re.compile(r'''(
            \(#\w+\)|
            \(https://[^\s]+\)
                     )''', re.VERBOSE)

, но, как указано, \( ищет фактическую скобку (это не группировка)

, поэтому вы, вероятно, просто хотите

"(#\w+)|(https?://[^\s]+)"

вы можете используйте группы без захвата ((?:...)), если хотите

"((?:#\w+)|(?:https?://[^\s]+))"
0 голосов
/ 06 августа 2020

Что бы вы ни хотели искать с помощью своего регулярного выражения, вам необходимо убедиться, что вы избегаете # char, который является особенным, если вы компилируете регулярное выражение с re.X / re.VERBOSE flag . Эта опция включает комментарии внутри шаблона регулярного выражения, которые начинаются с неэкранированного символа ha sh и go до конца строки.

Когда строка содержит # который не находится в классе символов и ему не предшествует неэкранированный backsla sh, все символы от самого левого такого # до конца строки игнорируются.

Итак, предполагая вы хотите сопоставить либо хэштеги, либо указанные c URL-адреса, которые вы можете использовать

tweet_regex = re.compile(r'''
                     \#\w+             # Hashtag pattern
                     |                 # or
                     https?://\S+      # URLs
                     ''', re.VERBOSE)

См. демонстрацию кода Python , вывод:

['http://pybit.es/requests-cache.html', '#python', '#APIs']
0 голосов
/ 05 августа 2020

Вы можете использовать регулярное выражение следующим образом:

    http_hash_search = re.compile(r"(\w+:\/\/\S+)|(#[A-Za-z0-9]+)")

# [A-Za-z0-9] + --- Это будет искать #hashtag, за которым следует любое число или буквы

(\ w +: // \ S +) --- Это будет искать пути в твитах

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