字符串的python正则表达式

2024-10-01 15:39:51 发布

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

考虑一下这个字符串

prison break: proof of innocence (2006) {abduction (#1.10)}

我只想知道字符串中是否有(# floating point value )}

我尝试了一些正则表达式,比如

^{pr2}$

以及

re.search('\(\#+(\d\.\d)+\)\}',xyz)

什么都没用…有人能给我点建议吗


Tags: of字符串researchvaluepointbreakxyz
2条回答

尝试r'\(#\d+\.\d+\)\}'

().、和{}都是特殊的元字符,这就是它们前面加\的原因,所以它们是按字面匹配的。在

您还需要在右元素处应用+repetition。这里它附加到\d数字character class的简写,意思是只有数字可以出现一次或多次。在

使用r'raw string literals'可以更容易地使用regex模式,因为您不必过多地转义反斜杠。在

另请参见


变化

出于教学目的,让我们考虑一些变化。这将展示regex的一些基本特性。让我们首先考虑一种尝试的模式:

\(\#+(\d\.\d)+\)\}

为了便于阅读,我们将各部分隔开:

^{pr2}$

所以这个模式匹配:

  • 文字(,后跟一个或多个#
  • 后跟一个或多个:
    • 一个数字,一个字点,还有一个数字
  • 后跟一个文本)}

因此,模式将匹配,例如(###1.23.45.6)}as seen on rubular.com)。显然这不是我们想要的模式。在

现在让我们尝试修改解决方案模式,并假设我们还希望只允许一个数字序列,而不允许后面的句点和后面的数字。我们可以通过将该部分分组(…),并使用?使其成为可选的。在

BEFORE
\(#\d+\.\d+\)\}
      \___/
      let's make this optional! (…)?

AFTER
\(#\d+(\.\d+)?\)\}

现在模式匹配例如(#1.23)}以及例如(#666)}as seen on rubular.com)。在

参考文献

“Escape everything”并使用原始文本语法以确保安全:

>>> s='prison break: proof of innocence (2006) {abduction (#1.10)}'
>>> re.search(r'\(\#\d+\.\d+\)\}', s)
<_sre.SRE_Match object at 0xec950>
>>> _.group()
'(#1.10)}'
>>> 

这里假设“浮点值”指的是“一个或多个数字、一个点、一个或多个数字”,并且不能容忍其他浮点语法变化、多个哈希(从RE模式中可以看到,但在Q的文本中没有提到)、相关部分中的任意空白(同样,不清楚你是否需要它)。。。有些问题可以很容易地进行调整,而另一些则“不那么容易”(例如,很难猜测您希望支持什么样的FP语法变体)。在

相关问题 更多 >

    热门问题