匹配所有内容直到可选字符串(Python正则表达式)

匹配所有内容直到可选字符串(Python正则表达式),python,regex,Python,Regex,我在这个问题上绞尽脑汁,似乎我错过了一些非常琐碎的东西,所以提前道歉。我有一个url,它可能包含,也可能不包含一些POST值。我想匹配整个url,直到这个可选部分(不包括在内)。例如: import re myurl = r'http://myAddress.com/index.aspx?cat=ThisPartChanges&pageNum=41' matchObj = re.match(r'(.*?)(&pageinfo=\d+){0,1}', myurl) print

我在这个问题上绞尽脑汁,似乎我错过了一些非常琐碎的东西,所以提前道歉。我有一个url,它可能包含,也可能不包含一些POST值。我想匹配整个url,直到这个可选部分(不包括在内)。例如:

import re
myurl = r'http://myAddress.com/index.aspx?cat=ThisPartChanges&pageNum=41'
matchObj  =  re.match(r'(.*?)(&pageinfo=\d+){0,1}', myurl)
print matchObj.groups()
>> ('', None)

# Putting the non-greedy ? outside
matchObj  =  re.match(r'(.*)?(&pageinfo=\d+){0,1}', myurl)
print matchObj.groups()
>> ('http://myAddress.com/index.aspx?cat=ThisPartChanges&pageNum=41', None)

# The url might also be without the last part, that is
myurl = r'http://myAddress.com/index.aspx?cat=ThisPartChanges'
# I'd like the regex to capture the first part. "ThisPartChanges" might 
# be different every time
我想得到的是pageNum=\d+之前的所有内容,不包括在内。 就是

我只对pageNum之前的部分感兴趣,不在乎它是否存在,只想以某种方式过滤掉它,这样我就可以得到真正的地址,直到cat=

我尝试过各种非贪婪的杂技,但失败的是第二部分是可选的,所以没有什么可以“锚定”非贪婪的比赛。 你知道如何优雅地做到这一点吗?只有第一部分是重要的。也欢迎非正则表达式解决方案


谢谢

您可能想看看

传递参数的顺序可能会更改:

?pageNum=41&cat=ThisPartChanges

你可能想看看

传递参数的顺序可能会更改:

?pageNum=41&cat=ThisPartChanges

我建议您在url解析时避免使用正则表达式,改用它,下面是一个解决您问题的有效示例:

import urlparse

myurl = 'http://myAddress.com/index.aspx?cat=ThisPartChanges&pageNum=41'

parsed = urlparse.urlparse(myurl)

print 'scheme  :', parsed.scheme
print 'netloc  :', parsed.netloc
print 'path    :', parsed.path
print 'params  :', parsed.params
print 'query   :', parsed.query
print 'fragment:', parsed.fragment
print 'username:', parsed.username
print 'password:', parsed.password
print 'hostname:', parsed.hostname, '(netloc in lower case)'
print 'port    :', parsed.port

print urlparse.parse_qs(parsed.query)

我建议您在url解析时避免使用正则表达式,改用它,下面是一个解决您问题的有效示例:

import urlparse

myurl = 'http://myAddress.com/index.aspx?cat=ThisPartChanges&pageNum=41'

parsed = urlparse.urlparse(myurl)

print 'scheme  :', parsed.scheme
print 'netloc  :', parsed.netloc
print 'path    :', parsed.path
print 'params  :', parsed.params
print 'query   :', parsed.query
print 'fragment:', parsed.fragment
print 'username:', parsed.username
print 'password:', parsed.password
print 'hostname:', parsed.hostname, '(netloc in lower case)'
print 'port    :', parsed.port

print urlparse.parse_qs(parsed.query)

在您的情况下,这可以做到:

^[^&]+
更稳健:

^[^?]+\?cat=[^&]+
示例:

In [40]: s = 'http://myAddress.com/index.aspx?cat=ThisPartChanges&pageNum=41'

In [41]: re.search(r'^[^&]+', s).group()
Out[41]: 'http://myAddress.com/index.aspx?cat=ThisPartChanges'

In [42]: re.search(r'^[^?]+\?cat=[^&]+', s).group()
Out[42]: 'http://myAddress.com/index.aspx?cat=ThisPartChanges'

在您的情况下,这可以做到:

^[^&]+
更稳健:

^[^?]+\?cat=[^&]+
示例:

In [40]: s = 'http://myAddress.com/index.aspx?cat=ThisPartChanges&pageNum=41'

In [41]: re.search(r'^[^&]+', s).group()
Out[41]: 'http://myAddress.com/index.aspx?cat=ThisPartChanges'

In [42]: re.search(r'^[^?]+\?cat=[^&]+', s).group()
Out[42]: 'http://myAddress.com/index.aspx?cat=ThisPartChanges'

谢谢我不熟悉,谢谢。我不太熟悉使用urlparse肯定会更好,但是对于您的正则表达式问题,它将是
re.match(r'^(.*)&pageNum=.*,myurl)
(.*)(&pageNum=\d+){0,1}
几乎是正确的,您只需要添加一个字符串结束锚定:
(.*)(&pageNum=\d+{0,1}$
。祝您好运!没错!我怎么会错过呢?:):)(我现在觉得有点傻,但是谢谢!)使用URLPASSE肯定会更好,但是对于您的正则表达式问题,它将是
re.match(r'^(.*)&pageNum=.*,myurl)
(.*)(&pageNum=\d+){0,1}
几乎是正确的,您只需要添加一个字符串结束锚定:
(.*?(&pageNum=\d+){0,1}$