如何使用正则表达式提取子字符串?
How to extract a substring using a regular expression?
我确实在这样的查询中遇到过字符串
o = 'some interesting {foo123:bar_675:get_me.xyz} string'
我想从大括号内的部分中提取最后一个冒号之后的部分,所以在这种情况下 get_me.xyz
.
我知道正则表达式 \{.*:(.*)\}
可以工作(在 Python 中测试):
import re
o = 'some interesting {foo123:bar_675:get_me.xyz} string'
re.findall('\{.*:(.*)\}', o)
将return
['get_me.xyz']
现在如何在查询中使用此正则表达式?
我试过了
SELECT (regex(?o, "\{.*:(.*)\}") as ?substring) ?o
WHERE {
?s ?p ?o .
}
但这总是会引发错误
Parse error on line 6:
...SELECT (regex(?o, "\{.*:(.*)\}") as ?
---------------------^
Expecting 'IRIREF', 'PNAME_NS', 'VAR', '(', 'INTEGER', '!', '-', 'FUNC_ARITY0', 'FUNC_ARITY1', 'FUNC_ARITY2', 'IF', 'BOUND', 'BNODE', 'EXISTS', 'COUNT', 'FUNC_AGGREGATE', 'GROUP_CONCAT', 'DECIMAL', 'DOUBLE', 'true', 'false', 'STRING_LITERAL1', 'STRING_LITERAL2', 'STRING_LITERAL_LONG1', 'STRING_LITERAL_LONG2', 'INTEGER_POSITIVE', 'DECIMAL_POSITIVE', 'DOUBLE_POSITIVE', 'INTEGER_NEGATIVE', 'DECIMAL_NEGATIVE', 'DOUBLE_NEGATIVE', 'PNAME_LN', '+', 'NOT', 'CONCAT', 'COALESCE', 'SUBSTR', 'REGEX', 'REPLACE', got 'INVALID'
REGEX是过滤测试,REPLACE是抽取操作
SELECT *
WHERE {
?s ?p ?o .
FILTER REGEX(?o, "\{.*:(.*)\}")
}
测试 ?o
,不提取 ()
部分。
注意双 \
.
提取使用BIND-REPLACE。
SELECT * {
?s ?p ?o .
BIND(REPLACE(?o, "^.*\{.*:(.*)\}.*$", "") AS ?substring)
}
在一般情况下,您可能需要 str(?o)
而不是函数中的 ?o
。
我确实在这样的查询中遇到过字符串
o = 'some interesting {foo123:bar_675:get_me.xyz} string'
我想从大括号内的部分中提取最后一个冒号之后的部分,所以在这种情况下 get_me.xyz
.
我知道正则表达式 \{.*:(.*)\}
可以工作(在 Python 中测试):
import re
o = 'some interesting {foo123:bar_675:get_me.xyz} string'
re.findall('\{.*:(.*)\}', o)
将return
['get_me.xyz']
现在如何在查询中使用此正则表达式?
我试过了
SELECT (regex(?o, "\{.*:(.*)\}") as ?substring) ?o
WHERE {
?s ?p ?o .
}
但这总是会引发错误
Parse error on line 6:
...SELECT (regex(?o, "\{.*:(.*)\}") as ?
---------------------^
Expecting 'IRIREF', 'PNAME_NS', 'VAR', '(', 'INTEGER', '!', '-', 'FUNC_ARITY0', 'FUNC_ARITY1', 'FUNC_ARITY2', 'IF', 'BOUND', 'BNODE', 'EXISTS', 'COUNT', 'FUNC_AGGREGATE', 'GROUP_CONCAT', 'DECIMAL', 'DOUBLE', 'true', 'false', 'STRING_LITERAL1', 'STRING_LITERAL2', 'STRING_LITERAL_LONG1', 'STRING_LITERAL_LONG2', 'INTEGER_POSITIVE', 'DECIMAL_POSITIVE', 'DOUBLE_POSITIVE', 'INTEGER_NEGATIVE', 'DECIMAL_NEGATIVE', 'DOUBLE_NEGATIVE', 'PNAME_LN', '+', 'NOT', 'CONCAT', 'COALESCE', 'SUBSTR', 'REGEX', 'REPLACE', got 'INVALID'
REGEX是过滤测试,REPLACE是抽取操作
SELECT *
WHERE {
?s ?p ?o .
FILTER REGEX(?o, "\{.*:(.*)\}")
}
测试 ?o
,不提取 ()
部分。
注意双 \
.
提取使用BIND-REPLACE。
SELECT * {
?s ?p ?o .
BIND(REPLACE(?o, "^.*\{.*:(.*)\}.*$", "") AS ?substring)
}
在一般情况下,您可能需要 str(?o)
而不是函数中的 ?o
。