【问题标题】:RegEx Matching Characters That Don't Have Specified SpaceRegEx 匹配没有指定空格的字符
【发布时间】:2019-04-23 01:42:52
【问题描述】:

我的 RegEx 也可以找到 here,尽管我手动插入字符来查找回车符。

((?:\d{6}?)([A-Z\d]{3})?(?:[\^r\ ]+)(([A-Z\d]{6}|[A-Z\d]{5} |[A-Z\d]{4}  ))?)

我在 5 和 4 个字符串之后指定了一个空格,但我的正则表达式似乎至少在第一行忽略了它。即使我不希望它匹配“EXTEND”。只要后面有空格。它可以在第三行使用“XOBUS”。

FPCN54 CWNT 080810^r^r EXTENDED FORE    #should not match anything
ASUS42 KMHX 080425^r^r RWRMHX^r^r WEAT  #should match RWRMHX
RXUS30 KWNO 081300^r^r XOBUS ^r^r GREA  #should match XOBUS w/ 1 trailing space
FXUS64 KEWX 081112 RR3^r^r AFDEWX^r^r   #should match RR3 and AFDEWX

编辑:忘记在第一个回车之前包含 3 个字符的字母数字。请参见第 4 行。也需要捕获它。

【问题讨论】:

  • 最好明确地说出你的正则表达式的想法是什么(它应该匹配后面跟着 ^r^r 或类似内容的第 4 个单词,是吗?)。因为正则表达式对于可能的回答者来说并不那么容易解析(特别是如果你有任何错误)。
  • @Sanyash 在一个 6 位字符串之后,它应该匹配一个 6 个字符的字母数字字符串、一个带有空格的 5 个字符的字母数字,或者一个带有两个空格的 4 个字符的字母数字。跨度>

标签: python regex


【解决方案1】:

根据上面您想要的输出,您使正则表达式过于复杂。 **顺便说一句,上面你说'5或4个字符串',但在你想要的输出中,你有一个“6”个字符串和一个3个字符串。

>>> import re



>>> string = '''FPCN54 CWNT 080810^r^r EXTENDED FORE    #should not match 
anything
ASUS42 KMHX 080425^r^r RWRMHX^r^r WEAT  #should match RWRMHX
RXUS30 KWNO 081300^r^r XOBUS ^r^r GREA  #should match XOBUS w/ 1 trailing 
space
FXUS64 KEWX 081112 RR3^r^r RR3555^r^r AFDEWX^r^r   #should match RR3, RR3555, and AFDEWX'''



>>> re.findall('(?m)([\d]*[A-Z]+(?:[A-Z]*[\d]*)*[\s]*)[\^r]{2,}', string)



#OUTPUT
['RWRMHX', 'XOBUS ', 'RR3', 'AFDEWX', 'RR3555']

【讨论】:

  • 我忘了我还需要在 6 位字符串之后匹配 3 个字符的字母数字(如果包含)。见编辑。
  • @klex52s 另外,我认为它们必须以字母开头?大写字母?
  • 其实在少数情况下它可能以数字开头!
  • 是的,只有大写字母。
  • @klex52s 我编辑了字符串并创建了一个新的正则表达式。不过,您发布的范围有点不一致。你可以玩弄上面的。
【解决方案2】:

This RegEx 可能会帮助您执行精确匹配并将您的字符串输入分成几个组,如果/如您所愿,并重建您的目标输出:

([A-Z0-9]{6})\s([A-Z]{4})\s([0-9]{6})([\^|r])+\s([A-Z]+)([\^|r\s]+)(.+)

您可以删除任何您希望的组(),它仍然会匹配。

如果你愿意,你可以减少界限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2017-06-28
    • 1970-01-01
    相关资源
    最近更新 更多