Python中的字符串替换和匹配2

时间:2013-08-08 20:31:28

标签: python

我有用户帖子,我想与预定的模式列表匹配(参见示例)。如果帖子匹配模式,我想将帖子和模式写入文件。做这个的最好方式是什么?到目前为止,我只想到了4个for循环强制它然后进行一些比较。我已经拥有了我需要的所有数据的列表,下面只是一些非常简单的例子,让您了解我在寻找什么。


示例

文章:

posts =['When I ate at McDonald\'s, I felt sick.',
'I like eating at Burger King.',
'Wendy\'s made me feel happy.']

模式:

patterns = ['When I ate at [RESTAURANT]',
'I like eating at [RESTAURANT]',
'[RESTAURANT] made me feel [FEELING]',
'I felt [FEELING]']

解释

restaurant_names = ['McDonald\'s', 'Burger King', 'Wendy\'s']

feelings = ['happy', 'sick', 'tired']

OUTPUTFILE:

当我在[RESTAURANT]吃饭时,当我吃麦当劳时,我感到恶心。

我觉得[FEELING],当我在麦当劳吃饭时,我感到恶心。

[RESTAURANT]让我觉得[FEELING],Wendy让我感到高兴。

我喜欢在[RESTAURANT]吃东西,我喜欢在汉堡王吃东西。


-Sorry格式化,但这是我潜伏一段时间之后的第一篇关于stackoverflow的帖子。在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

这样的事情怎么样:

>>> sentences = ["When I ate at McDonald's, I felt sick.", 'I like eating at Burger King.', 
    "Wendy's made me feel happy."]
>>> patterns = {"McDonald's": "[RESTAURANT]", "Burger King": "[RESTAURANT]", 
    "Wendy's": "[RESTAURANT]", "happy": "[FEELING]", "sick": "[FEELING]", 
    "tired": "[FEELING]"}

然后你可以做

>>> for sentence in sentences:
...     replaced = sentence
...     for pattern in patterns:
...         if pattern in sentence:
...             replaced = replaced.replace(pattern, patterns[pattern])
...     print sentence
...     print replaced
...
When I ate at McDonald's, I felt sick.
When I ate at [RESTAURANT], I felt [FEELING].
I like eating at Burger King.
I like eating at [RESTAURANT].
Wendy's made me feel happy.
[RESTAURANT] made me feel [FEELING].

这仍然需要一些工作(例如,现在,单词carsick将成为car[FEELING]),您可能希望通过创建来避免patterns值中的所有重复您可以通过索引引用的另一个替换文本列表,但这可能足以让您入门?

答案 1 :(得分:1)

我不确定我理解。您能否发布到目前为止的确切代码,您打算做什么以及为什么?感谢。

一般来说,有4种选择:

1)使用单一但复杂的RegEx模式和严格列表

r"(When I ate at (?P<rest1>McDonald's|Burger King|Wendy's), I felt (?P<feel1>happy|sick|tired)\.)|(I like eating at (?P<rest2>McDonald's|Burger King|Wendy's)\.)"

对指定的捕获组rest1feel1rest2的分析将允许您确定在需要时使用的句子类型。否则,您可以输出整个匹配。当然,模式可以从您的列表中以编程方式组装。在连接元素时要小心使用re.escape()

2)使用单一但复杂的RegEx模式和松散列表

  r"(When I ate at (?P<rest1>[^,]+), I felt (?P<feel1>[a-z]+).)|(I like eating at (?P<rest2>[^.]+)\.)"

这样做的好处是可以捕获新的餐馆名称,感受等。缺点是依赖于标点符号/语法。示例:第一个模式无法识别嵌入了,的餐馆名称。

3)做你可能正在做的事情。自然语言分析比RegEx自己做的要复杂得多。

4)如果它不仅仅是几个固定的模式,而是关于分析帖子的含义而不管具体的措辞,那么你应该像其他海报所建议的那样使用NLTK。