【问题标题】:Having some issues with re.subre.sub 有一些问题
【发布时间】:2016-07-22 23:59:24
【问题描述】:

在我的程序中,我正在解析日语定义,我需要删除一些内容。我需要在三件事之间取出一些东西。 「text」(text)《text》

取出「」 之间的东西我一直在做sentence = re.sub('「[^)]*」','', sentence) 这个问题是,由于某种原因,如果「」 中有括号,它不会替换任何东西。另外,我尝试对其他两件事使用相同的代码,例如sentence = re.sub('([^)]*)','', sentence) sentence = re.sub('《[^)]*》','', sentence) 但由于某种原因它不起作用。没有错误或任何东西,它只是不能替代任何东西。

我怎样才能做到这一点,或者有更好的方法吗?

编辑:

不过,我对此的另一部分有一点小问题。在我更换任何东西之前,我会检查长度以确保它超过一定长度。

parse = re.findall(r'「[^」]*」','', match.text)
if len(str(parse)) > 8:
    sentence = re.sub(r'「[^」]*」','', match.text)

现在这似乎导致了一个错误:

Traceback (most recent call last):
  File "C:/Users/Dominic/PycharmProjects/untitled9/main.py", line 48, in <module>
    parse = re.findall(r'「[^」]*」','', match.text)
  File "C:\Python34\lib\re.py", line 206, in findall
    return _compile(pattern, flags).findall(string)
  File "C:\Python34\lib\re.py", line 275, in _compile
    bypass_cache = flags & DEBUG
TypeError: unsupported operand type(s) for &: 'str' and 'int'

我有点理解是什么原因造成的,但我不明白为什么仅仅因为轻微的变化就无法正常工作。我知道 re.sub 部分很好,只是前两行导致了问题。

【问题讨论】:

  • 您的正则表达式匹配角度之间不是括号的任何内容,所以难怪。你需要sentence = re.sub('「[^」]*」','', sentence)
  • 关于您编辑中的错误:re.findall 不接受替换字符串。因此match.text 作为flags 参数传递。

标签: python regex


【解决方案1】:

您应该阅读有关正则表达式的教程,以便了解您的正则表达式的作用。

正则表达式'「[^)]*」' 匹配角之间不是右括号的任何内容。你需要这个:

sentence = re.sub(r'「[^」]*」','', sentence)

第二个正则表达式还有一个问题:括号有特殊含义(当它们在方括号内不是时),所以要匹配括号你需要写\(\)。所以你需要这个:

'\([^)]*\)'

最后:您应该始终为您的 python 正则表达式使用原始字符串。在这种情况下,它碰巧不会产生影响,但它经常会产生影响,而且这些错误令人抓狂。例如,使用:

r'\([^)]*\)'

【讨论】:

  • 具体来说,它匹配任何不是括号的东西。
【解决方案2】:
sentence = re.sub(ur'「[^」]*」','', sentence)

                       ^^

您需要将negatiion based quantifer 更改为停在 而不是)

如果与它们打交道,你应该使用unicode 标志。如果其中有),那么它将失败,因为你使用了「[^)]*」

                ^^

您已指示正则表达式在找到) 时停止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多