0

我坚持做这样的事情..

由此

{Hi|Hello} I am - {Me|You|Us}

对此

#Possible results
'Hi I am - You'
'Hello I am - Me'
'Hi I am - Us'
'Hello I am - You'

所以基本上,代码将搜索用大括号 {} 括起来的单词。那些花括号里面有多个单词,它们会被拆分。总而言之,每个花括号都只会输出单词,它会随机选择。

我需要正则表达式吗?我尝试搜索预制库,但我发现了一个过时的库。有人可以帮忙吗?

4

2 回答 2

1

如果您的输入相对简单——只有出现{and}是为了提供多个可能的文本片段,如问题所示——你可以使用如下的正则表达式:

import re

p = re.compile('(\{[^\}]+\}|[^\{\}]*)')

然后您将文本拆分为如下片段:

frags = p.split("{Foo|Bar} baz {quux|wibble}.")
# ['', '{Foo|Bar}', '', ' baz ', '', '{quux|wibble}', '', '.', '']

对于此列表中的每个字符串,您可以生成一个可能值列表(只有一个用于不以 开头的字符串{):

def options(s):
    if len(s) > 0 and s[0] == '{':
        return [opt for opt in s[1:-1].split('|')]
    return [s]

options("foo")
# ["foo"]

options("{foo|bar}")
# ["foo", "bar"]

然后建立一个选项列表列表:

opt_lists = [options(frag) for frag in frags]

然后构建笛卡尔积并加入:

import itertools

for spec in itertools.product(*opt_lists):
    print(''.join(spec))

这是"{Foo|Bar} baz {quux|wibble}."示例的输出:

Foo baz quux.
Foo baz wibble.
Bar baz quux.
Bar baz wibble.

如果您的输入中有额外的复杂性,您可能需要对实际输入格式使用更复杂的正则表达式或解析器,但生成选项列表作为中间结果的一般想法仍然有效。

于 2013-07-14T00:09:53.360 回答
0

试试这个:

Tintadgel:~ dhoelzer$ python
Python 2.7.2 (default, Oct 11 2012, 20:14:37) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> p = re.compile('(Hi|Hello) I am - (Me|You|Us)')
>>> print p.match("Hi I am - You")
<_sre.SRE_Match object at 0x106481470>
>>> p.match("Hi I am - Yo")
>>> 

这是正在发生的事情。我们首先导入正则表达式库。完成后,我们接下来编译一个正则表达式,该表达式查找以“Hi”或“Hello”开头并以以下之一结尾的字符串:Me, You and Us。

创建后,我们现在可以直接对其进行匹配。注意print p.match("Hi I am - You")返回一个对象。这意味着我们有一场比赛!相反,p.match("Hi I am - Yo")不返回任何内容,表示未找到匹配项。

希望这可以帮助!您可能想看看http://docs.python.org/2/howto/regex.html

于 2013-07-13T22:55:35.553 回答