标签: pattern-matching

Python 3.10 模式匹配 (PEP 634) - 字符串中的通配符

我有一个很大的 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 的一个相对较新的补充,因此目前还没有太多关于如何使用它的指南。

python json pattern-matching python-3.x python-3.10

28
推荐指数
1
解决办法
4677
查看次数

Haskell Bytestrings:如何模式匹配?

我是一个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 …

haskell pattern-matching bytestring pattern-synonyms

27
推荐指数
4
解决办法
6004
查看次数

如何在Emacs中设置reftex-view-crossref-extra?

该表达式reftex-view-crossref-extrareftex-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-RESEARCH-RE,使得 reftex-view-crossref这几样工程的纪录?

regex emacs pattern-matching org-mode

27
推荐指数
1
解决办法
674
查看次数

Scala字符串模式匹配最佳实践

我目前正在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)

scala pattern-matching

27
推荐指数
3
解决办法
3万
查看次数

仅显示grep的第n个匹配项

onefish
onechicken
twofish
twochicken
twocows
threechicken
Run Code Online (Sandbox Code Playgroud)

如果我想grep包含"two"的行,但我只想要第二场比赛,该怎么办?所以我希望结果"twochicken".

bash grep pattern-matching match

27
推荐指数
4
解决办法
5万
查看次数

Rust 中 .. 和 _ 有什么区别?

在这种情况下,两个句点和下划线之间有什么区别:

 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)

两者都可以编译并运行,但是为什么要选择其中一个而不是另一个呢?

pattern-matching match rust

27
推荐指数
1
解决办法
1993
查看次数

查找字符串的公共前缀

我有4个字符串:

"h:/a/b/c"
"h:/a/b/d"
"h:/a/b/e"
"h:/a/c"
Run Code Online (Sandbox Code Playgroud)

我想找到这些字符串的公共前缀,即"h:/a".怎么找到?

通常我会用分隔符拆分字符串'/'并将其放在另一个列表中,依此类推.
有没有更好的方法呢?

c# string pattern-matching

26
推荐指数
5
解决办法
2万
查看次数

RegExp匹配重复的字符

例如我有字符串:

 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)

但我认为我很丑,并寻求更好的解决方案.我正在寻找正则表达式解决方案,而不是自编有限状态机.

python regex pattern-matching

26
推荐指数
5
解决办法
2万
查看次数

PostgreSQL全文搜索和Trigram混淆

我对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会替换全文吗?三卦更准确吗?三卦如何表现?

postgresql full-text-search pattern-matching

26
推荐指数
1
解决办法
4499
查看次数

如何在Scala中对泛型类型进行模式匹配?

我们假设我们有一个泛型类Container:

case class Container[+A](value: A)
Run Code Online (Sandbox Code Playgroud)

然后,我们希望模式匹配一个ContainerDoubleContainerAny:

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特定类型的参数化?

scala pattern-matching type-erasure

26
推荐指数
4
解决办法
2万
查看次数