从字符串中提取文本

3

我有一个看起来像下面这样的文档:

{{ link.description | default text }}
{{ link.description |default text}}

正如您所见,"default text"周围可能会有空格,我想使用Python的re库提取文本"default text"使用以下代码:
default = re.findall('|[ ]*(.*?)[ ]*}}', doc)

很不幸,使用上述正则表达式并不能得到所需的结果。我试图使用(.*?)来捕获“默认文本”,但似乎这并没有起作用。


FYI:你可以写 \s* 或者只写 *(空格和星号,格式不正确)来代替 [ ]*。只有一个字符组的字符组有点无意义。 - Felix Kling
2
从re模块导入nothing;s.partition("|")[-1].rstrip('}').strip() - DSM
3个回答

2
>>> st = '{{ link.description | default text }}'
>>> re.findall(r'\|\s*(.*?)\s*}',st)
['default text']
>>> st1  = '{{ link.description | default text }}'
>>> re.findall(r'\|\s*(.*?)\s*}',st1)
['default text']
>>>

在你的正则表达式中|[ ]*(.*?)[ ]*}}
1)你需要转义|
2)使用\s*来表示white-space出现。

实际上,这里需要使用\s*。而且在\s*部分不需要使用惰性匹配。 - Niklas B.
最初我认为空格会出现0或1次。 - RanRag
在这种情况下,它将是\s? - Niklas B.
@NiklasB。我正在做一个小项目,所以+已经成为我的习惯了。那只是一个打字错误。 - RanRag

1

你需要对 | 符号进行转义,因为在正则表达式中它具有特殊的含义(表示备选匹配):

default = re.findall('\|[ ]*(.*?)[ ]*}}', doc)

0

个人而言,我不会在这么简单的事情上使用正则表达式。

ldescrs = open(fname,"r")
for ln in ldescrs.readlines():
   print ln.rstrip("{}\n").partition("|")[2].strip()

ln.strip("{}\n ")会清除文件中每行末尾的换行符、空格和大括号。

.partition("|")[2]将字符串以|为分隔符进行分割,获取第二个元素,即默认文本。

.strip()由于默认文本左右可能有空格,我们也要去掉。严格来说,只需要左侧去空格即可,但如果你决定要分离链接描述关键字(分割结果的元素0),那么这样做就少了一件事要改。元素0可能在右侧有额外的空格。

你有整个工具箱,何必使用凿子呢?用合适的螺丝刀就能完成工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接