Python 3 - 旋转文本

时间:2013-07-13 22:43:43

标签: regex python-3.x spintax

我坚持做这样的事情......

来自

{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'

基本上,代码将搜索包含在花括号{} 中的单词。那些花括号里面有多个单词,可以分开。总而言之,每个花括号将仅输出单词,它将随机选择。

我需要正则表达式吗?我试着寻找预制的图书馆,但我刚发现一个过时的图书馆。有人可以帮忙吗?

2 个答案:

答案 0 :(得分: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和Us。

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

希望这有帮助!您可能需要查看http://docs.python.org/2/howto/regex.html

答案 1 :(得分:0)

如果您的输入相对简单 - {}的唯一出现是为了提供多个可能的文本片段,如问题中所示 - 您可以使用像这样的正则表达式以下内容:

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.

如果输入中存在其他复杂性,则可能需要使用更复杂的正则表达式或解析器作为实际输入格式,但是生成选项列表列表作为中间结果的一般想法仍然有效。< / p>