python中regex.compile()参数中的不同前缀



在写re.compile时,我多次使用r前缀(re.compile(r'(xyx))。但是,我第一次看到(re.compile(f'(xyx)),我不确定它在做什么。输出对我来说也没有任何意义。有人可以解释一下这个f在这里做什么吗?

import re, string
re_tok = re.compile(f'([{string.punctuation}“”¨«»®´·º½¾¿¡§£₤‘’])')
def tokenize(s): 
return re_tok.sub(r' 1 ', s).split()

>>> tokenize('˚∆˙©∆©˙¬ ldgkl slgh lshsg ieh 954n bvery590oerfdb o3pg')

格式化字符串文本或 f 字符串是以"f"或"F"为前缀的字符串文本。

这些字符串可能包含替换字段,这些字段是由大括号 {} 分隔的表达式。

虽然其他字符串文本始终具有常量值,但格式化字符串实际上是在运行时计算的表达式。

在这种情况下:

'string.punctuation`` are a replacement field, i.e. the string is to be formatted with字符串两边的大括号。标点符号, which, in Python, is a 'string of ASCII characters which are considered punctuation marks in theC' 区域设置'。

要了解更多信息,请查看这些 Python 文档和string.punctuation参考资料:-)

根据python文档:

2.4.3. 格式化字符串文字

版本 3.6 中的新功能。

格式化字符串文本或 f 字符串是字符串文本,即 前缀为'f''F'。这些字符串可能包含替换 字段,由大括号{}分隔的表达式。而 其他字符串文本始终具有常量值,格式化字符串 实际上是在运行时计算的表达式。

文档中有多个示例,因此我将发布其中的一些示例并解释:

name = "Fred"
f"He said his name is{name!r}."
# "He said his name is 'Fred'.

在这里,!引入了一个转换字段。!r呼叫repr()

然后使用format()协议格式化结果。格式说明符将传递给表达式或转换结果的__format__()方法。省略格式说明符时,将传递空字符串。然后,格式化结果将包含在整个字符串的最终值中。

由于它是使用format()协议格式化的,因此以下是其他用例:

width = 10
precision = 4
value = decimal.Decimal("12.34567")
f"result: {value:{width}.{precision}}"
# result:      12.35

偶数日期时间对象:

today = datetime(year=2017, month=1, day=27)
f"{today:%B %d, %Y}"
# January 27, 2017

利用上面的信息,让我们将其应用于您的代码:

f'([{string.punctuation}“”¨«»®´·º½¾¿¡§£₤‘’])'

上面的行是将string.punctuation插入到该位置的字符串中。

根据文档,string.punctuation是:

C区域设置中被视为标点字符的 ASCII 字符字符串。

如果您真的想更深入地了解这一点:C区域设置是什么?

C 标准将区域设置定义为程序范围的属性,更改该属性的成本可能相对较高。最重要的是,某些实现被破坏,频繁的区域设置更改可能会导致核心转储。这使得区域设置难以正确使用。

最初,当程序启动时,无论用户的首选区域设置是什么,区域设置都是C区域设置。

这些是修改字符串文本行为的各种标志r表示原始字符串,f表示字符串插值

请参阅PEP的解释:

F 字符串提供了一种使用最少语法在字符串文本中嵌入表达式的方法。应该注意的是,f 字符串实际上是在运行时计算的表达式,而不是常量值。在 Python 源代码中,f 字符串是一个文字字符串,前缀为"f",其中包含大括号内的表达式。表达式将替换为其值。一些例子是:

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date(1991, 10, 12)
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."

https://www.python.org/dev/peps/pep-0498/

和蟒蛇文档:

关于r

字符串

和字节文本都可以选择以字母"r"或"R"为前缀;此类字符串称为原始字符串,并将反斜杠视为文字字符。因此,在字符串文本中,不会特别处理原始字符串中的"\U"和"\u"转义。鉴于Python 2.x的原始Unicode文字行为与Python 3.x的行为不同,不支持"您的"语法。

https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals

关于f

格式化字符串文本或 f 字符串是以"f"或"F"为前缀的字符串文本。这些字符串可能包含替换字段,这些字段是由大括号 {} 分隔的表达式。虽然其他字符串文本始终具有常量值,但格式化字符串实际上是在运行时计算的表达式。

https://docs.python.org/3/reference/lexical_analysis.html#f-strings

这只是 Python的新文字字符串插值(f 字符串),从 Python 3.6 开始可用

最新更新