正则表达式 URL 帮助:单词或短语

Posted

技术标签:

【中文标题】正则表达式 URL 帮助:单词或短语【英文标题】:Regex URL Help: Word or Phrase 【发布时间】:2015-09-29 17:42:06 【问题描述】:

我是正则表达式的绝对菜鸟(我有点了解基础知识并且需要帮助一个单词或一个短语。如果它是一个短语,那么用连字符分隔每个单词 - :

这是我当前的正则表达式,它只匹配一个单词:

r'^streams/search/(?P<stream_query>\w+)/$

?P 只允许 URL 接受参数。

额外说明:我正在使用带有 Django urls.py 的 python re 模块

有什么建议吗?

这里有一些例子:

game
gsl
starcraft-2014
final-fantasy-iv
word1-word2-word-3

更新说明: 我基本上需要一个正则表达式来扩展当前的,所以在同一个正则表达式中,没有其他的:

r'^streams/search/(?P<stream_query>\w+)/$

所以在这个里面包含新的正则表达式,其中 ?P\w+ 是 Django 认为是参数的任何单词(并被传递到函数中)。

URL 定义,其中包括正则表达式: url(r'^streams/search/(?P\w+)/$', 'stream_search', name='stream_search')

然后,Django 将该参数传递给 stream_search 函数,该函数接受该参数:

def stream_search(request, stream_query):
    #here I manipulate the stream_query string, ie: removing the hyphens

所以,再一次,我需要一个 re 来匹配一个单词或短语,它们被传递到 stream_query 参数(或者如果需要,第二个)。 所以,我希望 stream_query 拥有的是:

word1

或 word1-word2-word3

【问题讨论】:

你能举一个你试图匹配的两个案例的例子吗? 我不确定你想要什么。我假设您想要给定单词和短语的正则表达式。我建议用 "[a-z]+" 表示一个单词,用 [a-z\-] 表示用连字符分隔的单词 @Darwin 刚刚添加了几个例子 @alexcons 你能提供整个网址的例子吗? @Darwin example.com/streams/search/rocket-league-word3-word4example.com/streams/search/word1 【参考方案1】:

如果我正确理解您的问题,那么您可能根本不必使用正则表达式。

根据您的示例:

example.com/streams/search/rocket-league-fsdfs-fsdfs

似乎您要处理的术语总是在最后一个/ 之后找到。所以你可以rsplit 然后检查-。这是一个例子:

url = "example.com/streams/search/rocket-league-fsdfs-fsdfs"
result = url.rsplit("/", 1)[-1]
#result = ["example.com/streams/search", "rocket-league-fsdfs-fsdfs"]
if "-" in result:
    #do whatever you want with the string
else:
    #do whatever you want with the string

或者匹配wordword-word-word 的正则表达式是:[\w-]+

【讨论】:

问题是,django首先需要一个参数,本例是rocket-league-sdfd-fdsds或者word1,然后我就可以使用了查询作为重新格式化的字符串。因此,我得到了该格式的 rocket-league-fdsf-fsds,所以我没有收到 404 错误,然后我可以删除连字符或做任何我想做的事情 @alexcons 您能否扩展您的问题以提供您需要的完整示例?我不使用 django,所以我不知道“首先需要参数”是什么意思。 @alexcons 如果您要在某事上运行正则表达式,您将需要以字符串形式访问 url。由于您想使用正则表达式,我假设您可以将 url 作为字符串访问,因此您可以应用我的示例。如果我的示例不适用于您的情况,您需要详细说明为什么它不起作用,以便我进行更新。 不,我无权访问字符串,因为 Django 处理正则表达式。 Django 检查您在 url 中输入的参数是否与正则表达式匹配。因此,如果 /streams/search/QUERY,如果 QUERY 与 url 定义中的正则表达式匹配,那么它将运行该页面,否则,我将获得 404 错误。这就是为什么,现在,我的正则表达式接受一个单词,所以每当我输入多个单词时,我都会得到 404 让我们continue this discussion in chat.【参考方案2】:

试试这个,

import re
str = "http://example.com/something?id=123&action=yes"
regex = "(query\d+)=(\w+)"
re.findall(regex, str)

你也可以使用 Python 的 urlparse 库,

from urlparse import url parse
urlparse = urlparse("http://example.com/something?id=123&action=yes")

拨打url parse即可返回

ParseResult(scheme='http', netloc='example.com', path='/something', params='', query='id=123&action=yes', fragment='')

【讨论】:

如何在我提供的 URL 中实现这一点?我是正则表达式的绝对初学者 如果我正确理解了您的问题,您正在尝试获取 url 的参数,这意味着 "(query\d+)=(\w+)" 在 = 之后和 & 之前返回值

以上是关于正则表达式 URL 帮助:单词或短语的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 正则表达式路由匹配所有内容,但不完全匹配一个或多个单词

正则表达式:匹配文本段落中除特定短语外的所有内容

R中的正则表达式命名组

正则表达式删除第一个单词并使用 c# 将第二个单词的第一个字符大写

正则表达式 - 对 URL 友好的任何文本

如何设置只接受 3 个特定单词的 Django URL 正则表达式?