我正在为subreddit做一个小型机器人。为此,我从trakt.tv中删除了一些数据。报废后,我在上面运行了一个正则表达式
obituarySecondary = re.match(r"^([\w \,\.\"]+, \d{4} ?- ?\w+ \d+, ?\d{4})", obituaryRaw).group(0)
我得到了符合要求的结果,Nathaniel Fisher, Sr.1943-2000
现在我在obituarySecondary
上运行了另一个正则表达式
timeline = "\n\n" + re.match(r'(\d{4} ?- ?\d{4})', obituarySecondary).group(0)
但这总是返回None
。
我在https://regex101.com/
上运行了相同的正则表达式,以确保我做的正确,并且字符串匹配,但在我的系统上不匹配。
答案 0 :(得分:4)
function rolesFlattener(obj) {
let final = {};
Object.keys(obj).forEach((item, index) => {
const path = item.split('_');
if(path.length > 1) {
path.reduce((prev, current, i, array) => {
if(!final[prev]) {
final[prev] = {
status: 'limited',
subOptions: {}
}
}
final[prev].subOptions[current] = true;
return current;
});
}
else {
final[path[0]] = {
status: 'full'
}
}
})
console.log(final)
}
// userRole: {
// home: {
// status: 'full'
// },
// products: {
// status: 'limited',
// subOptions: {
// edit: true,
// create: true
// }
// },
// orders: {
// status: 'limited',
// subOptions: {
// delete: true,
// }
// },
// pages: {
// status: 'limited',
// subOptions: {
// category: {
// status: 'limited',
// subOptions: {
// create: true,
// }
// },
// }
// }
// }
let sampleObj = {
home: true,
products_edit: true,
products_create: true,
orders_delete: true,
pages_category_create: true
}
rolesFlattener(sampleObj)
仅搜索字符串中的第一项,而使用re.match()
查看this StackOverflow问题以获取更多详细信息
答案 1 :(得分:2)
这是因为re.match()
仅匹配字符串的开头,而不匹配每行的开头。
re.match()
的Python文档指出如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的匹配对象。如果字符串与模式不匹配,则返回
None
;请注意,这与零长度匹配不同。请注意,即使在MULTILINE模式下,
re.match()
也只会在字符串的开头而不是在每一行的开头匹配。如果要在字符串中的任意位置找到匹配项,请改用
search()
。
match()
与search()
基于正则表达式有两种原始操作:
re.match()
:仅在字符串开头检查匹配项re.search()
:哪个检查字符串中任何位置的匹配项。例如:
>>> re.match("Fisher", "The Fisher Man") # No match
>>> re.search("Fisher", "The Fisher Man") # Match
<re.Match object; span=(4, 10), match='Fisher'>
最好使用search()
限制字符串开头的匹配,您可以使用以'^'
开头的正则表达式:
>>> re.match("Fisher", "The Fisher Man") # No match
>>> re.search("^Fisher", "The Fisher Man") # No match
>>> re.search("^The", "The Fisher Man") # Match
<re.Match object; span=(0, 3), match='The'>
在多行模式下,match()
仅在字符串的开头匹配,而将search()
与以'^'
开头的正则表达式结合使用将在每行的开头< / strong>。
>>> para = "Hello How are you?\nHope you are doing Good!\nSee you in the evening."
>>> re.match('Hope', para, re.MULTILINE) # No match
>>> re.search('^Hope', para, re.MULTILINE) # Match
<re.Match object; span=(19, 23), match='Hope'>