考虑这个字符串
prison break: proof of innocence (2006) {abduction (#1.10)}
我只是想知道字符串中是否有(# floating point value )}
我试过几个像
这样的正则表达式re.search('\(\#+\f+\)\}',xyz)
和
re.search('\(\#+(\d\.\d)+\)\}',xyz)
没有任何效果......有人可以在这里建议我
答案 0 :(得分:3)
尝试r'\(#\d+\.\d+\)\}'
(
,)
,.
和}
都是特殊的元字符,这就是为什么它们前面有\
,所以它们是字面意思相反。
您还需要在正确的元素中应用+
repetition。这里附加了\d
- 数字character class的简写 - 表示只有数字可以出现一次或多次。
使用r'raw string literals'
可以更容易地使用正则表达式模式,因为您不必过度地转义反斜杠。
出于教学目的,我们考虑一些变化。这将显示正则表达式的一些基本功能。我们首先考虑一种尝试模式:
\(\#+(\d\.\d)+\)\}
为了便于阅读,我们将这些部分分开:
\( \#+ ( \d \. \d )+ \) \}
\__________/
this is one group, repeated with +
所以这个模式匹配:
(
,后跟一个或多个#
)}
因此,该模式将匹配例如(###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)。
答案 1 :(得分:3)
“逃避一切”并使用raw-literal语法来确保安全:
>>> 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文中没有提及),相关部分之间的任意空白(再次,从你的Q中不清楚是否需要它),...... - 一些问题可以很容易地调整,其他的“不是这么多“(特别难以猜出你想要支持的FP语法变体的范围)。