正则表达式,更好的方法

2024-05-16 21:32:08 发布

您现在位置:Python中文网/ 问答频道 /正文

如果分隔符在字符串中,那么如何分隔可以在字符串中多次匹配的正则表达式,即: 好吧,那么“棒棒棒”(BBS)aota“棒棒棒”(BBB)

正则表达式:“'.+'(\S+)” 从“砰”到“砰”再到“砰”。。。(BBB)而不是匹配“Bang Bang swing”(BBS)和“Bing Bong Bin”(BBB)

我有一种使用regex的方法:'[a-z0-9-/?|q~ `!@#$%^&;*()\=+]+'(\S+) 但这是过分的,老实说,我讨厌它甚至工作正常。 我对regex相当陌生,从Pythons开始实现它们显然不是最明智的开始方式。你知道吗


Tags: 方法字符串binregexampbingbbbbang
2条回答

这个正则表达式怎么样

'.+?'\(\S+\)

要获得从一个字符到另一个字符的子字符串,两者都不能出现在之间,您应该始终考虑使用negated character classes。你知道吗

The [negated] character class matches any character that is not in the character class. Unlike the dot, negated character classes also match (invisible) line break characters. If you don't want a negated character class to match line breaks, you need to include the line break characters in the class. [^0-9\r\n] matches any character that is not a digit or a line break.

所以,你可以用

'[^']*'\([^()]*\)

regex demo

在这里

  • '[^']*'-匹配',后跟0个或多个除'以外的字符,然后再跟一个'
  • \(-匹配文字)(必须转义)
  • [^()]*-匹配除()之外的0个或多个字符(它们不必在字符类中转义)
  • \)-匹配文字)(必须在字符类外转义)。你知道吗

如果在(...)部分之前可能有一个或多个单引号,则需要一个展开的惰性匹配正则表达式:

'[^']*(?:'(?!\([^()]*\))[^']*)*'\([^()]*\)

regex demo。你知道吗

这里,'[^']*(?:'(?!\([^()]*\))[^']*)*''.*?'使用DOTALL标志匹配,但是由于线性regex执行,效率要高得多。见more about unrolling regex technique here。你知道吗

编辑:

当输入字符串不复杂且不短时,惰性点匹配会更有效。但是,当复杂性增加时,延迟点匹配可能会导致问题。你知道吗

相关问题 更多 >