我有一个URLS列表,我试图从中获取id号码。我试图使用URLParse和正则表达式的组合来解决这个问题。以下是我的函数的样子:
def url_cleanup(url):
parsed_url = urlparse(url)
if parsed_url.query=="fref=ts":
return 'https://www.facebook.com/'+re.sub('/', '', parsed_url.path)
else:
qry = parsed_url.query
result = re.search('id=(.*)&fref=ts',qry)
return 'https://www.facebook.com/'+result.group(1)
但是,我觉得正则表达式result = re.search('id=(.*)&fref=ts',qry)
无法匹配某些URL,如下例所示。
#1
id=10001332443221607 #No match
#2
id=6383662222426&fref=ts #matched
我尝试按照this回答中提供的建议,将我的正则表达式改为id=(.*).+?(?=&fref=ts)
,并再次匹配#2而不是上述示例中的#1。
我不确定我在这里缺少什么。任何建议/提示将不胜感激。
答案 0 :(得分:2)
你的正则表达式确实是错误的。
使用表达式var mammoth = require("mammoth");
mammoth.convertToHtml({path: "path/to/document.docx"})
.then(function(result){
var html = result.value; // The generated HTML
var messages = result.messages; // Any messages, such as warnings during conversion
})
.done();
,您只会匹配id=(.*)&fref=ts
字面上成功的ID。
使用&fref=ts
您将执行相同的操作,但使用前瞻,这是一个非捕获组表达式。这意味着您的匹配只会是id=(.*).+?(?=&fref=ts)
部分,但前提是id=blablabla
成功。
此外,&fref=ts
将匹配由数字,字母,符号组成的ID ......几乎任何东西。使用id=(.*)
将匹配'仅限数字'ID。
所以,尝试使用
id=\d+
它将允许您仅捕获数字,假设您的ID始终为数字,并且仅捕获(使用括号)这些数字供以后使用。
有关进一步参考,请参阅 http://www.regular-expressions.info/python.html
答案 1 :(得分:1)
你的正则表达式需要稍微调整一下。尝试:
result = re.search('id=(\d+)(&fref=ts)?', qry)
id=(\d+)
匹配id=
后面的任意位数,而(&fref=ts)?
允许以下字母组是可选的。如果需要,这将允许您重新添加它们。
您还应注意,如果未找到匹配项,则会引发错误 - 因此您可能需要略微更改为:
result = re.search('id=(\d+)(&fref=ts)?', qry)
if result:
return 'https://www.facebook.com/'+result.group(1)
else:
# some error catch