【问题标题】:Regex expression to match string with specifc char正则表达式将字符串与特定字符匹配
【发布时间】:2018-02-05 16:40:47
【问题描述】:

我正在解析不同的文档,并且我想要一个正则表达式模式来消除模式中未包含的任何字符。 我使用的模式是'[^0-9^a-z^A-Z^.^,^/^-]',我的输出字符串是re.sub('[^0-9^a-z^A-Z^.^,^/^-]', ' ', line)

但如果行是iban: es45 **** **** 1234 5678 9012,星号就会消失。 我已经尝试过这种模式'[^0-9^a-z^A-Z^.^,^/^-^*]',但是像16-01-2107 这样的字符串失败了。

我想处理这样的字符串:

foo
Foo
BAR: foo 
Bar B.R.
45%
1.000,42
16-01-2107
16/01/2107
es45 **** **** 1234 5678 9012

我的模式适用于所有这些字符串,除了最后一个。

我如何修改这种情况下的模式?

编辑: 为了更简洁,我想得到我刚才写的字符串,消除文件行可能包含的其余字符,例如制表符、换行符、空行、非 ASCII 字符、{} 或 |

【问题讨论】:

  • 预期的输出究竟是什么?此外,您提到您正在尝试消除模式中没有的任何字符,但那到底是什么?您的正则表达式不正确,因此很难确定您实际上要做什么。我认为您正在尝试匹配不是0-9a-zA-Z.,/- 的任何内容。如果是这种情况,请使用 [^0-9a-zA-Z.,/-]
  • 您的问题似乎使用模糊,项目符号列出预期和预期
  • 也许[^0-9a-zA-Z.,/*-] 和这个outcome
  • 你是对的。我的问题不清楚。我已经编辑过了。我写的字符串是我需要的输出。但是,lines 文件包含其他字符、制表符、空行、/r/n... 我需要删除它
  • @the-fourth-bird 这正是我想要的。正则表达式是如此之大,如此之难。我想我使尝试表达复杂化。谢谢

标签: python regex python-2.7


【解决方案1】:

所以给定一个字符串,你想从字符串中删除所有字符除了这些字符:[0-9a-zA-Z.,/*-]

对于初学者来说,匹配除这些字符之外的任何字符的正则表达式是

[^0-9a-zA-Z.,/*-]

使用此代码将为您提供一个已删除所有所需字符的输出字符串:

re.sub('[^0-9a-zA-Z.,/*-]+', '', line)

使用您的示例字符串,以下是每个字符串的输出:

foo
Foo
BARfoo //space and colon removed
BarB.R. //space removed
45 //removed %
1.000,42
16-01-2107
16/01/2107
es45********123456789012  //spaces removed

【讨论】:

  • 感谢您的回复,但@the-fourth-bird 他写的正是我想要的。和你发的基本一样。感谢您的宝贵时间
【解决方案2】:

您需要正确转义字符,请尝试以下操作。

[^0-9a-zA-Z.,\-\*]+$

【讨论】:

  • 这是错误的。在 python re 中的括号内,您不必转义这些字符,因为它们在其中没有特殊含义。
  • 我是 javascript 用户,这只是一个通用的正则表达式,不可知论。
  • @MegaIng 这并不意味着它错了。您可以选择对集合中的字符进行转义。
  • 另外,第一个正则表达式不符合要求。
  • 唯一可能需要转义的字符是-——但不幸的是,OP还不清楚是否需要它,或者因为不加选择地添加@而侥幸987654323@ 让它工作......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2019-05-01
  • 2013-10-18
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
相关资源
最近更新 更多