Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找任何带有逗号或空格的文本_Python_Regex - Fatal编程技术网

Python 查找任何带有逗号或空格的文本

Python 查找任何带有逗号或空格的文本,python,regex,Python,Regex,我有一些文字。你可以在这里看到 str1 = '{5723647 9 aqua\t \tfem nom/voc pl}{5723647 9 aqua\t \tfem dat sg}{5723647 9 aqua\t \tfem gen sg}' str2 = '{27224035 2 equo_,equus#1\t \tmasc abl sg}{27224035 2 equo_,equus#1\t \tmasc dat sg}' 以下是我想要得到的: result1 = [('aqua', '

我有一些文字。你可以在这里看到

str1 = '{5723647 9 aqua\t \tfem nom/voc pl}{5723647 9 aqua\t \tfem dat sg}{5723647 9 aqua\t \tfem gen sg}'
str2 = '{27224035 2 equo_,equus#1\t \tmasc abl sg}{27224035 2 equo_,equus#1\t \tmasc dat sg}'
以下是我想要得到的:

result1 = [('aqua', 'fem nom/voc pl'), ('aqua', 'fem dat sg'), ('aqua', 'fem gen sg')]
result2 = [('equus#1', 'masc abl sg'), ('equus#1', 'masc dat sg')]
如您所见,这里可以有两种变体:

  • (任意文本,)(word-I-need)\t\t(form-I-need)
  • (任意文本)(word-I-need)\t\t(表格-I-need)
  • 下面是我尝试过的正则表达式:

    pattern = re.compile(r'\d* \d*(?:,| )(.*?)\t \t(.*?)}')
    
    以下是我得到的:

    [('aqua', 'fem nom/voc pl'), ('aqua', 'fem dat sg'), ('aqua', 'fem gen sg')]
    [('equo_,equus#1', 'masc abl sg'), ('equo_,equus#1', 'masc dat sg')]
    
    但是,第二个必须是:

    [('equus#1', 'masc abl sg'), ('equus#1', 'masc dat sg')]
    

    你有什么建议?谢谢

    这将是少数人的观点,但是为什么不使用正则表达式逻辑来编写更容易使用正则表达式的东西,然后使用Python来编写其他东西呢?除此之外,它对变化更具鲁棒性。差不多

    >>> import re
    >>> 
    >>> str1 = '{5723647 9 aqua\t \tfem nom/voc pl}{5723647 9 aqua\t \tfem dat sg}{5723647 9 aqua\t \tfem gen sg}'
    >>> str2 = '{27224035 2 equo_,equus#1\t \tmasc abl sg}{27224035 2 equo_,equus#1\t \tmasc dat sg}'
    >>> 
    >>> pattern = re.compile("{([^\}]*)}")
    >>> 
    >>> def extract(part):
    ...     ps = part.split()
    ...     word = ps[2].split(',')[-1]
    ...     form = ' '.join(ps[3:])
    ...     return word, form
    ... 
    >>> for s in str1, str2:
    ...     for entry in re.findall(pattern, s):
    ...         print extract(entry)
    ... 
    ('aqua', 'fem nom/voc pl')
    ('aqua', 'fem dat sg')
    ('aqua', 'fem gen sg')
    ('equus#1', 'masc abl sg')
    ('equus#1', 'masc dat sg')
    

    这将是少数人的观点,但是为什么不使用正则表达式逻辑来编写更容易使用正则表达式的东西,然后使用Python来编写其他东西呢?除此之外,它对变化更具鲁棒性。差不多

    >>> import re
    >>> 
    >>> str1 = '{5723647 9 aqua\t \tfem nom/voc pl}{5723647 9 aqua\t \tfem dat sg}{5723647 9 aqua\t \tfem gen sg}'
    >>> str2 = '{27224035 2 equo_,equus#1\t \tmasc abl sg}{27224035 2 equo_,equus#1\t \tmasc dat sg}'
    >>> 
    >>> pattern = re.compile("{([^\}]*)}")
    >>> 
    >>> def extract(part):
    ...     ps = part.split()
    ...     word = ps[2].split(',')[-1]
    ...     form = ' '.join(ps[3:])
    ...     return word, form
    ... 
    >>> for s in str1, str2:
    ...     for entry in re.findall(pattern, s):
    ...         print extract(entry)
    ... 
    ('aqua', 'fem nom/voc pl')
    ('aqua', 'fem dat sg')
    ('aqua', 'fem gen sg')
    ('equus#1', 'masc abl sg')
    ('equus#1', 'masc dat sg')
    

    像这样的东西可能有用

    ([^{\s,]*)\t \t([^}]*)
    

    像这样的东西可能有用

    ([^{\s,]*)\t \t([^}]*)
    

    本例的预期输出是什么:
    23467 23 sfhd,fds fsf\t\tydfjskdfk
    @nhahtdh:不可能有这样的字符串。本例的预期输出是什么:
    23467 23 sfhd,fds fsf\t\tydfjskdfk
    @nhahtdh:不可能有这样的字符串。文本大约为100 MB,包含大约970000行这样的内容。可能太长了。:-)另一个选项(沿着相同的行)是使用正则表达式将其分解为多个过程。可能太长了。:-)另一种选择(大致相同)是使用正则表达式将其分解为多个过程。您是否愿意添加一个更健壮的答案,如编译后使用模式?您是否愿意添加一个更健壮的答案,如编译后使用模式?我无法将其分配给变量,更不用说编译了。你能举个例子吗?我不能把它分配给变量,更不用说编译了。你能举个例子吗?