我有一个很大的 JSON 对象列表,我想根据其中一个键的开头来解析这些对象,并使用通配符来处理其余的。很多键都是相似的,例如"matchme-foo"和"matchme-bar"。有一个内置通配符,但它仅用于整个值,有点像else.
我可能忽略了一些东西,但我在提案中找不到解决方案:
https://docs.python.org/3/whatsnew/3.10.html#pep-634-structural-pattern-matching
PEP-636 中还有更多相关信息:
https://www.python.org/dev/peps/pep-0636/#going-to-the-cloud-mappings
我的数据如下所示:
data = [{
"id" : "matchme-foo",
"message": "hallo this is a message",
},{
"id" : "matchme-bar",
"message": "goodbye",
},{
"id" : "anotherid",
"message": "completely diffrent event"
}, ...]
Run Code Online (Sandbox Code Playgroud)
我想做一些可以匹配 id 的事情,而不必制作一长串|'s。
像这样的东西:
for event in data:
match event:
case {'id':'matchme-*'}: # Match all 'matchme-' no matter what comes next
log.INFO(event['message'])
case {'id':'anotherid'}:
log.ERROR(event['message'])
Run Code Online (Sandbox Code Playgroud)
它是 Python 的一个相对较新的补充,因此目前还没有太多关于如何使用它的指南。
我是一个Haskell新手,并且在弄清楚如何模式匹配时遇到了一些麻烦ByteString.在[Char]我的函数的版本是这样的:
dropAB :: String -> String
dropAB [] = []
dropAB (x:[]) = x:[]
dropAB (x:y:xs) = if x=='a' && y=='b'
then dropAB xs
else x:(dropAB $ y:xs)
Run Code Online (Sandbox Code Playgroud)
正如所料,这会过滤掉字符串中出现的所有"ab".但是,我在尝试将其应用于a时遇到问题ByteString.
天真的版本
dropR :: BS.ByteString -> BS.ByteString
dropR [] = []
dropR (x:[]) = [x]
<...>
Run Code Online (Sandbox Code Playgroud)
产量
Couldn't match expected type `BS.ByteString'
against inferred type `[a]'
In the pattern: []
In the definition of `dropR': dropR [] = []
Run Code Online (Sandbox Code Playgroud)
[]显然是罪魁祸首,因为它是一个常规String而非一个ByteString.Subbing in …
该表达式reftex-view-crossref-extra为reftex-view-crossref函数设置了其他模式.它由Macro Regexp,Search Regexp和Highlight Group组成(如下图所示):
(MACRO-RE SEARCH-RE HIGHLIGHT).
MACRO-RE与宏匹配.SEARCH-RE是用于搜索交叉引用的正则表达式.此正则表达式中的`%s'将替换为点处的宏参数.HIGHLIGHT是一个整数,表示应突出显示匹配的哪个子组.
我正在尝试匹配以下模式(组织模式脚注):
[fn:author2000title:Optional text]
Run Code Online (Sandbox Code Playgroud)
author2000title是我想要匹配的biblatex标签.我怎么能写MACRO-RE和SEARCH-RE,使得 reftex-view-crossref这几样工程的纪录?
我目前正在Scala中迈出第一步,所以我正在寻找解决常见问题的最佳实践.以下是不起作用的代码,但它描述了我想要做的事情.能否请您推荐解决此问题的最佳方法?
def resolveDriver(url: String) = {
url match {
case url.startsWith("jdbc:mysql:") => "com.mysql.jdbc.Driver"
case url.startsWith("jdbc:postgresql:") => "org.postgresql.Driver"
case url.startsWith("jdbc:h2:") => "org.h2.Driver"
case url.startsWith("jdbc:hsqldb:") => "org.hsqldb.jdbcDriver"
case _ => throw new IllegalArgumentException
}
}
Run Code Online (Sandbox Code Playgroud) onefish
onechicken
twofish
twochicken
twocows
threechicken
Run Code Online (Sandbox Code Playgroud)
如果我想grep包含"two"的行,但我只想要第二场比赛,该怎么办?所以我希望结果"twochicken".
在这种情况下,两个句点和下划线之间有什么区别:
let a = Some("a");
match a {
Some(_) => println!("we are in match _"),
_ => panic!(),
}
match a {
Some(..) => println!("we are in match .."),
_ => panic!(),
}
Run Code Online (Sandbox Code Playgroud)
两者都可以编译并运行,但是为什么要选择其中一个而不是另一个呢?
我有4个字符串:
"h:/a/b/c"
"h:/a/b/d"
"h:/a/b/e"
"h:/a/c"
Run Code Online (Sandbox Code Playgroud)
我想找到这些字符串的公共前缀,即"h:/a".怎么找到?
通常我会用分隔符拆分字符串'/'并将其放在另一个列表中,依此类推.
有没有更好的方法呢?
例如我有字符串:
aacbbbqq
Run Code Online (Sandbox Code Playgroud)
结果我想要以下匹配:
(aa, c, bbb, qq)
Run Code Online (Sandbox Code Playgroud)
我知道我可以这样写:
([a]+)|([b]+)|([c]+)|...
Run Code Online (Sandbox Code Playgroud)
但我认为我很丑,并寻求更好的解决方案.我正在寻找正则表达式解决方案,而不是自编有限状态机.
我对PostgreSQL的全部概念,全文搜索和Trigram有点困惑.在我的全文搜索查询中,我正在使用tsvectors,如下所示:
SELECT * FROM articles
WHERE search_vector @@ plainto_tsquery('english', 'cat, bat, rat');
Run Code Online (Sandbox Code Playgroud)
问题是,这种方法不能解释拼写错误.然后我开始阅读关于 Trigram和pg_trgm:
通过其他示例,似乎使用了trigram或使用了向量,但从未使用过.所以我的问题是:他们一起使用过吗?如果是这样,怎么样?trigram会替换全文吗?三卦更准确吗?三卦如何表现?
我们假设我们有一个泛型类Container:
case class Container[+A](value: A)
Run Code Online (Sandbox Code Playgroud)
然后,我们希望模式匹配一个Container有Double和Container的Any:
val double = Container(3.3)
var container: Container[Any] = double
Run Code Online (Sandbox Code Playgroud)
为此,我们通常会写:
container match {
case c: Container[String] => println(c.value.toUpperCase)
case c: Container[Double] => println(math.sqrt(c.value))
case _ => println("_")
}
Run Code Online (Sandbox Code Playgroud)
但是,编译器会给出两个警告,前两个案例各一个.例如,第一个警告说:"类型模式容器[String]中的非变量类型参数字符串未被选中,因为它被擦除".由于擦除,在运行期间不可能区分不同类型的容器并且第一个捕获物将匹配.因此,类型的容器Container[Double]将与捕获Container[String]对象的第一个案例匹配,因此toUpperCase将在a上调用方法,Double并且java.lang.ClassCastException将抛出a.
如何匹配Container特定类型的参数化?
pattern-matching ×10
match ×2
python ×2
regex ×2
scala ×2
bash ×1
bytestring ×1
c# ×1
emacs ×1
grep ×1
haskell ×1
json ×1
org-mode ×1
postgresql ×1
python-3.10 ×1
python-3.x ×1
rust ×1
string ×1
type-erasure ×1