我的目标是在文本中找到并不总是存在所有匹配项的匹配项。
我正在尝试从网站上收集电话号码,电子邮件和场地网站。只有一些场地可以获得所有三种信息,但大多数只有一两个。我试着写一个代码。但是,仅当所有3个信息都可用时,它才有效。有人可以帮我解决什么问题吗?
grouped = re.compile('col-right[\s\S]*?' +
'Tel[\s\S]*?([0-9]{0,4}-?[0-9]{3,7}-?[0-9]{0,4}-?[0-9]{0,4})' +
'[\s\S]*?href="http://([\w\W]*?)"' +
'[\s\S]*?href="mailto:([\s\S]*?)">[\s\S]*?</div>')
for match in re.finditer(grouped, text):
print (match.group(1))
print (match.group(2))
print (match.group(3))
电话号码中的数字也用“ - ”分隔,但有时在“ - ”和下一组数字之间有一个空格。如何在代码中包含仅偶尔出现此空间的内容?
答案 0 :(得分:0)
你的逻辑很好,但需要一点工作。
首先,您需要电话号码。为它写一个正则表达式,并将其添加到一个组:var obj = [{tag: 'ft001', addr: 'DB415.DBD2'}, {tag: 'ft001', addr: 'DB415.DBD6'}];
function extractKey(arr, keyName) {
return arr.map(x=> x[keyName])
}
该组标有(regex)*
,(``)
表示它必须存在0次或更多次。
撰写下一个正则表达式,将其添加到另一个组*
和第三个组(emailRegex)*
。
而不是(website)*
您也可以使用*
,一次或根本不使用(我可以看到,您使用了?
。
现在,把它们放在一起,只需将它们与它们之间的任何角色混合
?
grup1匹配电话号码,后跟任何字符,电子邮件,后跟任何字符,网站。如果其中一个缺失,则完全没有问题。
电子邮件正则表达式示例:(可能不是最完整的一个)
(group1)?.*(emailRegex)?.*(website)*
这样的工作方式如下:电子邮件应以字母或下划线 _ 开头,后跟大写/小写,数字,下划线或点(。)后跟 @ 和字母后跟一个点(注意我使用([a-zA-Z_]+[a-zA-Z_.-0-9]*@[a-zA-Z0-9]\.[a-z]+])?
来逃避特殊的\.
表示法,最后你添加了至少一个混合一封信。
适用于 email@mail.com 。
我将整个正则表达式放在括号中意味着它是一个组,它应该出现一次或根本不出现(因此any character
)。在群组之间,您添加?
,这意味着在电话号码/电子邮件/地址之间可以是任何字符。